#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<list>
using namespace std;
const int N=8e5+100;
int h[N],ver[N*2],ne[N*2],tot;
int f[N];
list<int> d[N];
void add(int a,int b)
{
ver[tot]=b;
ne[tot]=h[a];
h[a]=tot++;
}
int find(int x)
{
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
tot=0;
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
f[i]=i;
d[i].clear();
d[i].push_back(i);
h[i]=-1; //不然会超时
}
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
int q;
scanf("%d",&q);
while(q--)
{
int x;
scanf("%d",&x);
if(x!=find(x)) continue;
int len=d[x].size();
while(len--)
{
int u=d[x].front();
for(int i=h[u];i!=-1;i=ne[i])
{
int y=ver[i];
int fy=find(y);
int fu=find(u);
if(fy==fu) continue;
f[fy]=fu;
d[fu].splice(d[fu].end(),d[fy]);
}
d[x].pop_front();
}
}
for(int i=0;i<n;i++)
{
if(i==0) printf("%d",find(i));
else printf(" %d",find(i));
}
printf("\n");
}
}
Operating on a Graph(链表+并查集)
最新推荐文章于 2022-07-23 23:46:55 发布