GOperating on a Graph(并查集+临边染色)

Posted starve

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GOperating on a Graph(并查集+临边染色)相关的知识,希望对你有一定的参考价值。

题:https://ac.nowcoder.com/acm/contest/5668/G

题意:给定n点m边图,q个询问,每个询问为x颜色,若此时图上有x颜色的部分,这该部分临边的部分会被染成x颜色(有可能是一个点,有可能是同种颜色的子图)

分析:因为一种颜色只能由一次覆盖临边的机会,所以每次操作只需要维护子图的“祖”颜色和该子图的临边部分即可。

技术图片
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define MP make_pair
typedef long long ll;
const int mod=1e9+7;
const int M=8e5+6;
const int inf=0x3f3f3f3f;
const ll INF=1e18;
vector<int>g[M],col[M],tmp;
int f[M];
int Find(int x){
    return x==f[x]?x:f[x]=Find(f[x]);
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            f[i]=i,col[i].clear(),g[i].clear();
        for(int u,v,i=0;i<m;i++){
            scanf("%d%d",&u,&v);
            g[u].pb(v);
            g[v].pb(u);

        }
        int q;
        scanf("%d",&q);
        while(q--){
            int x;
            scanf("%d",&x);
            if(Find(x)!=x)
                continue;
            tmp.clear();
            tmp=g[x];
            g[x].clear();
            for(auto now:tmp){
                int u=Find(now);
                if(u!=x){
                    f[u]=x;
                    ///合并未染色的未染色
                    if(g[x].size()<g[u].size())
                        swap(g[x],g[u]);
                    for(auto v:g[u])
                        g[x].pb(v);
                }
            }
        }
        for(int i=0;i<n;i++)
            printf("%d ",Find(i));
        printf("
");
    }
    return 0;
}
View Code

 

以上是关于GOperating on a Graph(并查集+临边染色)的主要内容,如果未能解决你的问题,请参考以下文章

D - Harmonious Graph(并查集)(此题需补)

[hdu 5354] Bipartite Graph 分治 并查集

hdu1116 Play on Words--并查集&网络流

HDOJ6958KD-Graph(并查集)

UOJ_14_UER #1DZY Loves Graph_并查集

2015多校第6场 HDU 5354 Bipartite Graph CDQ,并查集