本校OJ的题目,并查集相关
时间复杂度O(n2)但是平均时间20ms,so不是时间复杂度的问题
求助
代码如下:
#include<iostream>
using namespace std;
int n,m,p,x,y,cnt;
int find(int* fa,int n){
if(fa[n]==n)return n;
return fa[n]=find(fa,fa[n]);
}
void merge(int* fa,int a,int b){
a=find(fa,a),b=find(fa,b);
fa[b]=a;
}
int main(){
cin>>n>>m;
int fa[n+5];
int di[n+5];
for(int i=1;i<=n;i++)fa[i]=i;
for(auto& i:di)i=0;
for(int i=0;i<m;i++){
cin>>p>>x>>y;
switch(p){
case 0:
merge(fa,x,y);
break;
case 1:
di[x]=y;
di[y]=x;
break;
default:
break;
}
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++){
if(di[find(fa,i)] and di[find(fa,i)]==di[find(fa,j)])merge(fa,i,j);
}
for(int i=1;i<=n;i++)if(fa[i]==i)cnt++;
cout<<cnt;
return 0;
}