#include<iotream>
using namespace std;
int father[];
int findFather(int t){
while(t!=father[t])
t=father[t];
return t;
}
int findFather(int t){
if(t==father[t])
return t;
else
return findFather(father[t]);
}
void Union(int a,int b){
int faA=findFahter(a);
int faB=findFahter(b);
if(faA!=faB){
father[faA]=faB;
}
}
int findFather(int t){
int a=x;
while(t!=father[t])
t=father[t];
//现在t是根节点
while(a!=father[a]){
int z=a;
a=father[a];//a 变成原先a的父节点
father[z]=x;//将原先a的父亲变成 根节点x
}
}
int findFather(int t){
if(t==father[t])
return t;
else
return father[t]=findFather(father[t]);
//等价于
/*
{
int F=findFather(father[t]);
father[t]=F;
return F;
}
*/
}
int main(){
}
一共有几个集合
#include<bits/stdc++.h>
using namespace std;
int father[110];
bool isRoot[110]={0};
int n,m,a,b,sum;
void init(int n){
for(int i=1;i<=n;i++)
father[i]=i;
}
int findFather(int t){
if(t==father[t])
return t;
return father[t]=findFather(father[t]);
}
void Union(int a,int b){
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB)
father[faA]=faB;
}
int main(){
ios::sync_with_stdio(0);
cout.tie(0);cin.tie(0);
cin>>n>>m;
init(n);
while(m--){
cin>>a>>b;
Union(a,b);
}
/*
if(k==father[k])
*/
for(int i=1;i<=n;i++)
isRoot[findFather(i)]= true;
for(int i=1;i<=n;i++)
if(isRoot[i])
sum++;
cout<<sum<<endl;
return 0;
}
每个集合里有多少个元素
#include<bits/stdc++.h>
using namespace std;
int father[110];
int isRoot[110]={0};
int n,m,a,b,sum;
void init(int n){
for(int i=1;i<=n;i++)
father[i]=i;
}
int findFather(int t){
if(t==father[t])
return t;
return father[t]=findFather(father[t]);
}
void Union(int a,int b){
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB)
father[faA]=faB;
}
int main(){
ios::sync_with_stdio(0);
cout.tie(0);cin.tie(0);
cin>>n>>m;
init(n);
while(m--){
cin>>a>>b;
Union(a,b);
}
for(int i=1;i<=n;i++)
isRoot[findFather(i)]++;
for(int i=1;i<=n;i++)
cout<<isRoot[i]<<endl;
return 0;
}