Description
In the Not-Spreading-Your-Sickness University (NSYSU), there are many student groups. Students in the same group intercommunicate with each other frequently, and a student may join several groups. To prevent the possible transmissions of SARS, the NSYSU collects the member lists of all student groups, and makes the following rule in their standard operation procedure (SOP).
Once a member in a group is a suspect, all members in the group are suspects.
However, they find that it is not easy to identify all the suspects when a student is recognized as a suspect. Your job is to write a program which finds all the suspects.
Input
A case with n = 0 and m = 0 indicates the end of the input, and need not be processed.
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
这个题意思是0号同学患有传染病,只要与0号同学同组甚至只要在同一张关系网中就被视为传染病携带者,
要求找出所有的携带者
思路:
把每组同学,搜查合并,然后判断每个同学是否与0号在同一张关系网中。
AC 代码:
#include <iostream>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<deque>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
int F[110000],r[110000],p[330000];
bool cmp(int a,int b)
{
return a<b;
}
int find1(int n)
{
int root=n;
int temp=n;
while(root!=F[root])
root=F[root];
while(temp!=root)
{
int t=F[temp];
F[temp]=root;
temp=t;
}
return root;
}
void union1(int x,int y)
{
int root1=find1(x);
int root2=find1(y);
if(root1!=root2)
{
if(root1>root2)
F[root1]=root2;
else
F[root2]=root1;
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)&&(n||m))
{
for(int i=0;i<n;i++)
F[i]=i;
memset(r,0,sizeof(r));
int z=0;
for(int i=0;i<m;i++)
{
int a;
scanf("%d",&a);
for(int j=0;j<a;j++)
{
scanf("%d",&p[j]);
}
//sort(p,p+a,cmp);
for(int j=1;j<a;j++)
{
union1(p[j-1],p[j]);
}
}
for(int i=0;i<n;i++)
if(find1(0)==find1(i))
z++;
printf("%d\n",z);
}
}