Operating on a Graph

G. 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;
}

posted @ 2020-07-19 23:44  caoanda  阅读(145)  评论(0编辑  收藏  举报