poj1611(并查集)
1 #include <stdio.h> 2 using namespace std; 3 int set[30005]; 4 int num[30005]; 5 void makeset(int n) 6 { 7 for(int i=0;i<n;i++) 8 { 9 set[i]=i; 10 num[i]=1; 11 } 12 } 13 14 15 int findset(int x) 16 { 17 if(x!=set[x]) 18 { 19 set[x]=findset(set[x]);//之所以不可以直接返回是因为这里可能有多层的关系 20 } 21 return set[x]; 22 } 23 void Union(int a,int b) 24 { 25 int x=findset(a); 26 int y=findset(b); 27 if(x==y) 28 { 29 return ; 30 } 31 if(num[x]>=num[y]) 32 { 33 num[x]+=num[y]; 34 set[y]=set[x]; 35 } 36 else 37 { 38 num[y]+=num[x]; 39 set[x]=set[y]; 40 } 41 } 42 int main() 43 { 44 int peopleNum,groupNum,eachNum,first,index; 45 while(1) 46 { 47 scanf("%d %d",&peopleNum,&groupNum); 48 if(peopleNum==0 && groupNum==0) break; 49 makeset(peopleNum);// 50 for(int k=0;k<groupNum;k++) 51 { 52 scanf("%d %d",&eachNum,&first); 53 for(int j=1;j<eachNum;j++) 54 { 55 scanf("%d",&index); 56 Union(first,index); 57 } 58 } 59 printf("%d\n",num[findset(0)]); 60 61 } 62 return 0; 63 }
其实就那么几个函数,搞明白了关系就行了,可以看下接下来写的模板