Operating on a Graph
这道题需要注意的点是,合并的时候需要用链表\(O(1)\)进行合并或者用 vector 启发式合并,这样才不至于复杂度过大,另外,去重的时候,如果用哈希 map 会导致超时,而用 map 则不会
// Created by CAD
#include <bits/stdc++.h>
using namespace std;
const int maxn=8e5+5;
list<int> g[maxn];
int fa[maxn];
map<int,bool> vis;
int find(int x){
    return fa[x]==x?x:fa[x]=find(fa[x]);
}
int main() {
    int t;cin>>t;
    while(t--){
        int n,m;scanf("%d%d",&n,&m);
        for(int i=0;i<=n;++i) fa[i]=i,g[i].clear();
        for(int i=1;i<=m;++i){
            int a,b;scanf("%d%d",&a,&b);
            g[a].push_back(b);
            g[b].push_back(a);
        }
        int q;scanf("%d",&q);
        while(q--){
            vis.clear();
            int x;scanf("%d",&x);
            if(find(x)!=x) continue;
            list<int> l;
            for(auto i:g[x]){
                int f=find(i);
                if(f==x||vis[f]) continue;
                l.splice(l.end(),g[f]);
                fa[f]=x;
                vis[f]=1;
            }
            swap(g[x],l);
        }
        for(int i=0;i<n;++i)
            cout<<find(i)<<" \n"[i==n-1];
    }
    return 0;
}
    CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号