Time Limit: 1000MS | Memory Limit: 20000K | |
Total Submissions: 28195 | Accepted: 13741 |
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
题意:在一个学校,有n个学生(编号为0~n-1)和m个社团,其中0号学生是有可能感染非典的,只要和有可能感染非典的人在一个社团,那么这个人就有可能会被感染并且要被隔离,问被隔离的总人数。
首先输入n和m,然后是m行,每行的开始是一个k,表示社团有k个人。
1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 #define MAX 30005 5 int father[MAX],num[MAX]; 6 void make_set(int n) 7 { 8 for(int i=0;i<n;i++) 9 { 10 father[i]=i; 11 num[i]=1; 12 } 13 } 14 int find(int x) 15 { 16 return father[x]==x?x:father[x]=find(father[x]); 17 } 18 void Union(int u,int v) 19 { 20 int x,y; 21 x=find(u); 22 y=find(v); 23 if(x!=y) 24 { 25 num[y]+=num[x]; 26 father[x]=y; 27 } 28 } 29 int main() 30 { 31 int n,m,k,u,v; 32 while(~scanf("%d%d",&n,&m),n||m) 33 { 34 make_set(n); 35 while(m--) 36 { 37 scanf("%d%d",&k,&u); 38 for(int i=1;i<k;i++) 39 { 40 scanf("%d",&v); 41 Union(u,v); 42 } 43 } 44 printf("%d\n",num[find(0)]); 45 } 46 return 0; 47 }
原文:http://www.cnblogs.com/cxbky/p/4827232.html