题目链接
思路:
用并查集来记录哪些点是相同的颜色,用vecter来记录相邻的点。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=8e5+7;
const double eps=1e-8;
const int mod=1e9+7;
const int inf=0x7fffffff;
const double pi=3.1415926535;
int f[N];
int Find(int x)
{
return f[x]==x?x:f[x]=Find(f[x]);
}
vector<int>g[N];
signed main()
{
IOS;
int t;
cin>>t;
while (t--)
{
int n,m;
cin>>n>>m;
for(int i=0;i<=n;i++)
{
f[i]=i;
g[i].clear();
}
for(int i=0,u,v;i<m;i++)
{
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
int q;
cin>>q;
while(q--)
{
int u;
cin>>u;
if(f[u]!= u)
{
continue;
}
vector<int>p=g[u];
g[u].clear();
for (int i=0;i<p.size();i++)
{
int v=Find(p[i]);
if (v!=u)
{
f[v]=u;
if(g[u].size()<g[v].size())
{
swap(g[u],g[v]);
}
for (int j=0;j<g[v].size();j++)
{
g[u].push_back(g[v][j]);
}
}
}
}
for (int i=0;i<n;i++)
{
cout<<Find(i)<<" ";
}
cout<<endl;
}
return 0;
}