题目链接:点击打开链接
并查集模板题。
FInd函数写递归路径压缩的竟然会爆栈。。只能写朴素的
查的时候每访问到一个元素x就把vis[x]变成1,这样最后查询的时候vis是1的就不用查了,查出来的结果vis如果是0 ,res就加1,再把它的vis变为1.
代码:
#include <iostream>
#include <cstdio>
using namespace std;
int Fa[1010];
int N,M;
bool vis[1010];
int Find(int n){
while(n!=Fa[n]){
vis[n]=1;
n=Fa[n];
}
return n;
}
void init(){
for(int i=1;i<=N;i++){
Fa[i]=i;
vis[i]=0;
}
}
int solve(){
for(int i=1;i<=N;i++) vis[i]=0;
int res=0;
for(int i=1;i<=N;i++){
if(vis[i]) continue;
int t=Find(i);
if(!vis[t]){ res++; vis[t]=1;}
}
return res;
}
int main(){
int T;
cin>>T;
while(T--){
cin>>N>>M;
int x,y;
init();
for(int i=1;i<=M;i++){
cin>>x>>y;
int t1=Find(x);
int t2=Find(y);
Fa[t1]=t2;
}
cout<<solve()<<endl;
}
return 0;
}