#include<stdio.h>
//n犯罪嫌疑人数量,m线索数量,sum计数器,犯罪团伙的数量
int f[20],n,m,sum=0;
//数组初始化
void init()
{
int i;
for(i=1;i<=n;i++)
f[i]=i; //f[i]=0;是否可行?
}
//查找v所在团伙的最高领导
int getf(int v)
{
if(f[v]==v)
return v;
else
{
f[v]=getf(f[v]);
return f[v]; //若合并为一条语句:return getf(f[v]),数组f[]发生什么改变?*/
}
}
//团伙合并--向左合并原则
void merge(int v,int u)
{
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2)
f[t2]=t1;
}
void main()
{
int i,j,x,y;
//输入犯罪嫌疑人的数量和线索数量
printf("请输入犯罪嫌疑人的数量和线索数量(空格分隔数据):\n");
scanf("%d%d",&n,&m);
init();
//输入m条线索
printf("请输入%d条线索:\n",m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
merge(x,y);
}
//扫描有多少个独立的犯罪团伙
for(i=1;i<=n;i++)
if(f[i]==i)
{
sum++;
printf("\n以%d为首领的犯罪团伙成员为:",i);
for(j=1;j<=n;j++)
if(getf(j)==i)
printf("%d ",j);
printf("\n");
}
printf("\n共有%d个独立的犯罪团伙\n",sum);
}