并查集(保存分组结果)

来源:互联网 发布:下载2345软件大全 编辑:程序博客网 时间:2024/05/22 01:53
//如果只是输出有多少个团伙,那么只要比较pre[i]==i即可,但是若要求将不同的组织分行打印出来,那么需要注意要再压缩一次路径,即再find()一次~

#include <stdio.h> int pre[101]; void merge(int b,int c); int find(int i); int main() {     int i,m,n,c,d,sum,ok;     scanf("%d%d",&n,&m);     for (i=1;i<=n;i++)        pre[i]=i;    for (i=1;i<=m;i++)    {        scanf("%d%d",&c,&d);        merge(c,d);    }    sum=0;    for (i=1;i<=n;i++)        if (pre[i]==i)        sum++;    printf("%d\n",sum);    sum=1;    for (i=1;i<=n;i++)   find(i);   while (sum<=n)    {        ok=0;    for (i=1;i<=n;i++)      if (pre[i]==sum)      {        ok=1;        printf("%d ",i);      }      if (ok)        printf("\n");        sum++;    }      return 0; } int find(int i) {     int j=i,temp;     while (pre[i]!=i)        i=pre[i];     while (j!=i)     {         temp=pre[j];//先记录下下一个长官         pre[j]=i;//统一都更新为i的手下         j=temp;//迭代     }     return i; } void merge(int b,int c) {     int t1,t2;     t1=find(b);     t2=find(c);     if (t1!=t2)     pre[t2]=t1;     return;}


0 0
原创粉丝点击