Time Limit: 1000MS | Memory Limit: 20000K | |
Total Submissions: 21611 | Accepted: 10468 |
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
并查集水题。
1 /*====================================================================== 2 * Author : kevin 3 * Filename : TheSuspects.cpp 4 * Creat time : 2014-07-17 16:18 5 * Description : 6 ========================================================================*/ 7 #include <iostream> 8 #include <algorithm> 9 #include <cstdio> 10 #include <cstring> 11 #include <queue> 12 #include <cmath> 13 #define clr(a,b) memset(a,b,sizeof(a)) 14 #define M 30010 15 using namespace std; 16 int father[M],_rank[M]; 17 void MakeSet() 18 { 19 for(int i = 0; i < M; i++){ 20 father[i] = i; 21 _rank[i] = 1; 22 } 23 } 24 int FindSet(int x) 25 { 26 if(x != father[x]){ 27 father[x] = FindSet(father[x]); 28 } 29 return father[x]; 30 } 31 void Union(int x,int y) 32 { 33 x = FindSet(x); 34 y = FindSet(y); 35 if(x == y) return ; 36 father[y] = x; 37 _rank[x] += _rank[y]; 38 } 39 int main(int argc,char *argv[]) 40 { 41 int n,m; 42 while(scanf("%d%d",&n,&m)!=EOF && n+m){ 43 MakeSet(); 44 int t; 45 for(int i = 0; i < m; i++){ 46 scanf("%d",&t); 47 int a,b; 48 if(t) scanf("%d",&a); 49 for(int j = 1; j < t; j++){ 50 scanf("%d",&b); 51 Union(a,b); 52 a = b; 53 } 54 } 55 int pa = FindSet(0); 56 printf("%d\n",_rank[pa]); 57 } 58 return 0; 59 }
poj 1611 -- The Suspects,布布扣,bubuko.com
原文:http://www.cnblogs.com/ubuntu-kevin/p/3851435.html