首页 > 其他分享 >退役划水二 诈尸记录(春季赛前打打板子)

退役划水二 诈尸记录(春季赛前打打板子)

时间:2023-02-20 21:46:21浏览次数:41  
标签:打板子 诈尸 int register head vis low 赛前 dis

图论

存图

链式前向星

$Code$
struct Graph{
    int cnt;
    int head[MAXN];

    Graph(){
        cnt = 0;
        memset(head, 0, sizeof(head));
    }

    struct Edge{
        int to, next, dis;
    }e[MAXN];

    inline void Add(int u, int v, int w){
        e[++cnt].to = v;
        e[cnt].dis = w;
        e[cnt].next = head[u];
        head[u] = cnt;
    }
}G;

最短路

\(\mathit{Floyed}\)

$Code$
void Floyed(){
    for(register int k = 1; k <= n; k++){
        for(register int i = 1; i <= n; i++){
            for(register int j = 1; j <= n; j++){
                if(k == i || k == j || i == j) continue;
                if(map[i][j] > map[i][k] + map[k][j]) map[i][j] = map[i][k] + map[k][j];
            }
        }
    }
}

\(\mathit{SPFA}\)

$Code$
void Spfa(int u){
    queue<int> q;
    memset(dis, 0x3f, sizeof(dis));

    q.push(u), dis[u] = 0, vis[u] = true;
    while(!q.empty()){
        int t = q.front();
        for(register int i = G.head[t]; i; i = G.e[i].next){
            int v = G.e[i].to;
            if(dis[v] > dis[t] + G.e[i].dis){
                dis[v] = dis[t] + G.e[i].dis;
                if(!vis[v]) q.push(v), vis[v] = true;
            }
        }
        vis[t] = false;
        q.pop();
    }
}

堆优化 \(\mathit{Dijkstra}\)

$Code$
struct Road{
    int pos, dis;

    bool operator < (const Road &a) const{
        return dis > a.dis;
    }
};

priority_queue< Road, vector<Road>, greater<Road> > q;

void Dijkstra(int u){
    memset(dis, 0x3f, sizeof(dis));

    dis[u] = 0, q.push((Road){u, 0});
    while(!q.empty()){
        int t = q.top().pos;
        q.pop();

        if(vis[t]) continue;
        vis[t] = true;
        for(register int i = G.head[t]; i; i = G.e[i].next){
            int v = G.e[i].to;
            if(dis[v] > dis[t] + G.e[i].dis){
                dis[v] = dis[t] + G.e[i].dis;
                if(!vis[v]) q.push((Road){v, dis[v]});
            }
        }
    }
}

最小生成树

\(\mathit{Prim}\) 算法

$Code$
struct Road{
    int pos, dis;

    bool operator < (const Road &a) const{
        return dis > a.dis;
    }
};

priority_queue< Road, vector<Road>, greater<Road> > q;

void Prim(){
    memset(dis, 0x3f, sizeof(dis));
    dis[1] = 0;
    q.push((Road){1, dis[1]});

    while(!q.empty() && tot < n){
        int k = q.top().pos;
        q.pop();

        if(used[k]) continue;
        tot++;
        sum += dis[k];
        used[k] = true;
        for(register int i = head[k]; i; i = e[i].next){
            int v = e[i].to;
            if(dis[v] > e[i].dis){
                dis[v] = e[i].dis;
                q.push((Road){v, dis[v]}); 
            }
        }
    }
}

\(\mathit{Kruskal}\) 算法

$Code$
struct Line{
    int from, to, dis;
}line[MAXM];

bool cmp(const Line &a, const Line &b){
    return a.dis < b.dis;
}

struct Union_Set{
    int fa[MAXN];

    void init(int n){
        for(register int i = 1; i <= n; i++) fa[i] = i;
    }

    int Find(int x){
        return fa[x] == x ? x : fa[x] = Find(fa[x]);
    }
}U;

void Kruskal(){
    U.init(n);
    sort(line + 1, line + 1 + m, cmp);

    for(register int i = 1; i <= m; i++){
        int u = line[i].from, v = line[i].to;
        int fa_u = U.Find(u), fa_v = U.Find(v);
        if(fa_u != fa_v){
            ++tot;
            U.fa[fa_u] = fa_v;
            G.Add(u, v, line[i].dis), G.Add(v, u, line[i].dis);
        }
        if(tot == n - 1) break;
    } 
}

\(\mathit{Tarjan}\)

求强连通分量及缩点

$Code$
void Tarjan(int u){
    low[u] = dfn[u] = ++num;
    vis[u] = true;
    stk[++top] = u;

    for(register int i = G.head[u]; i; i = G.e[i].next){
        int v = G.e[i].to;
        if(!dfn[v]){
            Tarjan(v);
            low[u] = min(low[u], low[v]);
        }
        else if(vis[v]) low[u] = min(low[u], dfn[v]);
    }

    if(low[u] == dfn[v]){
        ++tot; int t;
        do{
            t = stk[top--];
            vis[t] = false;
            belong[t] = tot;
        }while(t != u);
    }
}

void Rebuild(){
    G.cnt = 0;
    memset(G.head, 0, sizeof(G.head));

    for(register int i = 1; i <= m; i++){
        int u = from[i], v = to[i];
        if(belong[u] != belong[v]) G.Add(u, v);
    }
}

求割点

$Code$
void Tarjan(int u){
    dfn[u] = low[u] = ++num;
    int son = 0;
    for(register int i = G.head[u]; i; i = G.e[i].next){
        int v = G.e[i].to;
        if(!dfn[v]){
            ++son;
            Tarjan(v);
            low[u] = min(low[u], low[v]);
            if(dfn[u] <= low[v]){
                if(son > 1 || u != root) cut[u] = true;
            }
        }
        else low[u] = min(low[u], dfn[v]);
    }
}

求点双联通分量

$Code$
void Tarjan(int u, int fa){
    dfn[u] = low[u] = ++num;
    vis[u] = true, stk[++top] = u;
    int son = 0; bool first = true;

    for(register int i = G.head[u]; i; i = G.e[i].next){
        int v = G.e[i].to;
        if(first && v == fa){
            first = false;
            continue;
        }
        if(!dfn[v]){
            ++son;
            Tarjan(v, u);
            low[u] = min(low[u], low[v]);

            if(dfn[u] <= low[v]){
                cut[u] = true;
                ++tot;
                point[tot].push_back(u);
                int t;
                do{
                    t = stk[top--];
                    point[tot].push_back(u);
                }while(t != u);
            }
        }
        else low[u] = min(low[u], dfn[v]);
    }

    if(!fa && son == 1) cut[u] = false;
}

二分图

匈牙利算法

$Code$
bool dfs(int u){
    for(register int i = G.head[u]; i; i = G.e[i].next){
        int v = G.e[i].to;
        if(!vis[v]){
            vis[v] = true;
            if(!match[v] || dfs(match[v])){
                match[v] = u;
                return true;
            }
        }
    }

    return false;
}

int Hungary(){
    int ans = 0;

    for(register int i = 1; i <= n; i++){
        memset(vis, 0, sizeof(vis));
        if(dfs(i)) ++ans;
    }

    return ans;
}

\(\mathit{Kruskal}\) 重构树

$Code$
struct Line{
    int from, to, dis;
}line[MAXM];

bool cmp(const Line &a, const Line &b){
    return a.dis < b.dis;
}

struct Union_Set{
    int fa[MAXN];

    void init(int n){
        for(register int i = 1; i <= n; i++) fa[i] = i;
    }

    int Find(int x){
        return fa[x] == x ? x : fa[x] = Find(fa[x]);
    }
}U;

void Kruskal(){
    int tot = 0; sum = n, G.cnt = 0;
    memset(G.head, 0, sizeof(G.head));

    U.init(n << 1);
    sort(line + 1, line + 1 + m, cmp);

    for(register int i = 1; i <= m; i++){
        int u = line[i].from, v = line[i].to;
        int fa_u = U.Find(u), fa_v = U.Find(v);

        if(fa_u != fa_v){
            ++tot;
            val[++sum] = line[i].dis;
            G.Add(fa_u, sum), G.Add(sum, fa_u);
            G.Add(fa_v, sum), G.Add(sum, fa_v);
            U.fa[fa_u] = U.fa[fa_v] = sum;
        }
        if(tot == n - 1) break;
    }
}

标签:打板子,诈尸,int,register,head,vis,low,赛前,dis
From: https://www.cnblogs.com/TSTYFST/p/17139035.html

相关文章

  • 牛客CSP-S提高组赛前集训营2
    牛客CSP-S提高组赛前集训营2预估得分:100+100+40实际得分:65+80+40不开longlong见祖宗T1服务器需求https://ac.nowcoder.com/acm/contest/1101/A小多计划在接下来......
  • 2021牛客OI赛前集训营-提高组(第四场)总结
    概述预估得分:\(100+100+30+50=280\)实际得分:\(30+50+30+45=165\)T1最终测试题目大意\(n\)名选手,第\(i\)名选手的得分有\(0,\;a_{i,0},\;a_{i,......
  • 「NOIP赛前冲刺」ABC278F
    Solution简单状态压缩,考虑设\(f_{S,i}\)表示状态为\(S\)并且当前要求一个开头为\(s_i\)的结尾字符的单词,\(\text{First}\)如果能赢为\(0\),否则为\(1\)。那么很......
  • 2022赛前模测 提高组 第一场
    2022赛前模测提高组第一场Chain题面描述:现有\(n\)个不超过\(10^6\)的合数,每个均可表示为\(a=p*q\)(为两个互异素数)。若\(a=p_1*q_1(p_1<q_1),b=p_2*q_2(p_2<q_2)......
  • 2022/10/22 CSP赛前隔离时的模拟赛 1/3
    T1T2使用一种类似于摩尔投票法的东西(Keven_He说像,我不太觉得):将所有人分为两队,设第一队的总攻击力为\(a\),第二队的总攻击力为\(b\)。不妨设\(a\leb\),求\(\min(b-......
  • CSP-S赛前训练合集
    刷题queue:1015B组T3Gym102331C从GlobalRound23可以看出我状态差成啥样了。还好停课了。一些我认为厉害的东西会加粗。模拟赛会专门开另一系列文章并加密码,密码是......
  • 2022牛客OI赛前集训营-提高组(第一场) 奇怪的函数 根号很好用
    奇怪的函数考虑暴力,每次查询\(O(n)\)扫所有操作,修改\(O(1)\)这启发我们平衡复杂度,考虑分块。观察题目性质,可以发现,经过若干次操作后得到的结果一定是一个关于\(x\)的分......
  • 2022牛客OI赛前集训营-提高组(第一场)
    教练给我们打的离线(数据分治忘删,多solve一次,明明复杂度O(n^3)偏偏不想压空间敬重桥廊不挂的话,70+100+50+50,挂了是70+100+0+0/cy懒得写题解。。。......
  • 2022赛前模测 提高组验题- 18
    问题B:【2022NOIP联测210月2日】最短路问题V3我把我写的这个改了改格式去最短路的专题里都能A某些东西,比如:信使,对,这题的数据很水,但是我把它交到accoders上不是T了而是......
  • 赛前复习记录
    9.22CF1C,成功用正确思路写出了一份错误代码。9.23修改了昨日CF1C,发现问题是\(eps\)写太大了……......