标签:
Time Limit: 1000MS | Memory Limit: 20000K | |
Total Submissions: 24134 | Accepted: 11787 |
Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
Source
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <ctype.h> 6 #include <iostream> 7 #include <string> 8 #include <iomanip> 9 #include <algorithm> 10 #define N 30000 11 12 using namespace std; 13 int n, m; 14 int cnt[N]; 15 int fa[N]; 16 17 //0 < n <= 30000 and 0 <= m <=500 18 void init() 19 { 20 for(int i=0; i<N; i++) 21 { 22 fa[i]=i; 23 cnt[i]=1; 24 } 25 } 26 27 int findset(int x) 28 { 29 return fa[x]!=x? fa[x]=findset(fa[x]):x; 30 } 31 32 void union_set(int x, int y) 33 { 34 int xx=findset(x); 35 int yy=findset(y); 36 if(xx==yy) return; //说明两元素本来就属于同一个集合 返回 37 else if(xx<yy) //如果x的根节点比y的根节点 小 38 { 39 fa[yy]=xx; 40 cnt[xx]=cnt[xx]+cnt[yy]; 41 } 42 else if(xx>yy) 43 { 44 fa[xx]=yy; 45 cnt[yy]=cnt[yy]+cnt[xx]; 46 } 47 } 48 49 int main() 50 { 51 int dd, a, b; 52 while(scanf("%d %d", &n, &m)!=EOF) 53 { 54 if(n==0 && m==0) break; 55 init(); 56 for(int i=0; i<m; i++) 57 { 58 scanf("%d", &dd); 59 scanf("%d", &a); 60 for(int j=0; j<dd-1; j++) 61 { 62 scanf("%d", &b); 63 union_set(a, b); 64 a=b; 65 } 66 } 67 printf("%d\n", cnt[0] ); 68 } 69 return 0; 70 }
POJ 1611 The Suspects (并查集+数组记录子孙个数 )
标签:
原文地址:http://www.cnblogs.com/yspworld/p/4311874.html