并查集

来源:互联网 发布:手机报警软件 编辑:程序博客网 时间:2024/06/07 09:33
find()函数可以找到根节点,就是几个元素绑定在一起,找到第一个绑定的点
join()找到根节点,改变根节点,为了绑定更多元素
并查集好像用来将一堆数分为一组一组数
#include<stdio.h>
int sum=0;int a[30005]={0};int find(int b){    int p=b,i=b,j;    while(a[p]!=p)    {        p=a[p];    }    while(i!=p)    {        j=a[i];        a[i]=p;        i=j;    }    return p;}int join(int b,int c){    int i=find(b);    int j=find(c);    if(i==j)        return 0;    else{        a[i]=a[j];    }    return 1;}int main(){    int n,m;    int i,j,k;    int arr[30005]={0};    while(~scanf("%d %d",&n,&m))    {        if(n==0&&m==0) break;        sum=1;        for(i=0;i<n;++i)        {            a[i]=i;        }        for(i=0;i<m;++i)        {            if(m==0) break;            scanf("%d",&k);            for(j=0;j<k;++j)            {                scanf("%d",&arr[j]);            }            if(k>1){            for(j=1;j<k;++j)            {                join(arr[j],arr[j-1]);            }            }        }        for(i=0;i<n;++i)        {            find(i);        }        if(n==1)            printf("1\n");        else{        for(i=1;i<n;++i)        {            if(a[i]==a[0])                sum++;        }        printf("%d\n",sum);        }    }    return 0;}


0 0
原创粉丝点击