不会写,代码来自牛客网。
#include <iostream>
#include <map>
using namespace std;
const int MAXSIZE=100001;
int uset[MAXSIZE];
int Rank[MAXSIZE];
map<int,int> m;
void makeSet(int size)
{
for(int i=0;i<size;i++)
uset[i]=i;
for(int i=0;i<size;i++)
Rank[i]=0;
}
int find(int x)
{
if(x!=uset[x])
uset[x]=find(uset[x]);
return uset[x];
}
void unionSet(int x,int y)
{
if((x=find(x))==(y=find(y)))
return;
if(Rank[x]>Rank[y])
uset[y]=x;
else
{
uset[x]=y;
if(Rank[x]==Rank[y])
Rank[y]++;
}
}
int main()
{
int n;
makeSet(MAXSIZE);
cin>>n;
for(int i=1;i<=n;i++)
{
int t;
while(cin>>t)
{
if(t==0)
break;
unionSet(i,t);
}
}
for(int i=1;i<n+1;i++)
cout<<uset[i]<<" ";
cout<<endl;
for(int i=1;i<n+1;i++)
cout<<Rank[i]<<" ";
cout<<endl;
for(int i=1;i<=n;i++)
cout<<find(i)<<" ";
cout<<endl;
int count=0;
for(int i=1;i<=n;i++)
{
int t=find(i);
cout<<t<<":"<<m[t]<<" ";
if(m[t]==0)
{
count++;
m[t]=1;
}
}
cout<<endl;
cout<<count;
}