SOJ 1824 并查集

来源:互联网 发布:java subtract 编辑:程序博客网 时间:2024/06/07 10:52

 

并查集是对不想交集合上的操作,应用很多,思想比较简单,主要是2个操作,寻找父结点,合并两个集合

 

#include<stdio.h>#include<string.h>int a[30010];int fa[30010];int p[30010];int find(int x){   if(x!=fa[x])   fa[x]=find(fa[x]);   return fa[x];}void uion(int x,int y){    int fx=find(x);    int fy=find(y);    if(fx!=fy)    fa[fx]=fy;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)==2&&(n||m))    {       int i,j;       int k,x;       for(i=0;i<n;i++)       {       fa[i]=i;       p[i]=0;       }       for(i=1;i<=m;i++)       {         scanf("%d",&k);         for(j=0;j<k;j++)         {           scanf("%d",&x);           p[x]=i;         }         for(j=0;j<n;j++)         {           if(p[j]==p[x])           {             uion(j,x);           }         }       }       int count=0;       for(i=0;i<n;i++)       {          if(find(i)==find(0))          count++;       }       printf("%d\n",count);    }    return 0;}


 

 

 

原创粉丝点击