并查集想法

来源:互联网 发布:magento建站 编辑:程序博客网 时间:2024/06/05 18:13

并查集计算


杭电1232


数组 bin[]记录了每个点的前导点是什么,并查集的用法按照输入的点对寻找点的先导根节点,由是否拥有相同的根节点判断是否是在同一个集合里面,如果不是就加入到这个集合,最后根节点是自己的就是一个集合。

#include<stdio.h>int bin[1002];int findx(int x){    int r=x;    while(bin[r]!=r)        r=bin[r];    return r;}void merge(int x,int y){    int fx,fy;    fx = findx(x);    fy = findx(y);    if(fx != fy)                       bin[fx]=fy;                            //这里是bin[fx]=fy 而不是bin[x]=y   这就是问题所在} int main(){    int n,m,i,x,y,count;    while(scanf("%d",&n),n)    {        for(i=1;i<=n;i++)            bin[i] = i;        for(scanf("%d",&m);m>0;m--)        {            scanf("%d %d",&x,&y);            merge(x,y);        }        for(count=-1, i=1;i<=n;i++)            if(bin[i]==i)                count++;        printf("%d\n",count);    }}

0 0
原创粉丝点击