​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;
}

CAD加油!欢迎跟我一起讨论学习算法