题目: The Suspects
vjudge提交链接
密码:ayit606
题意:(盗图)
解题思路:
- 先忽略疑似患病是某某某。
- 重新分配团体,使得一个人只属于一个团体,并查集的合并。题目中所给的团体只能说明团体内成员互相认识。
- 找0号人所在团体,找他们的老大询问该团体的人数,当然也只有老大知道该集体人数。
代码:
//vis[i]表示i号手下有多少人(包括自己)
//f[i]=k表示的i号的老大为k
#include<stdio.h>
#define N 30001
int f[N];
int vis[N];
int a[N];
void init(int n)
{
for(int i=0;i<n;i++)
{
f[i]=i;
vis[i]=1;
}
}
int find(int x)
{
if(x!=f[x])
f[x]=find(f[x]);
return f[x];
}
void Merge(int u,int v)
{
int tu=find(u);
int tv=find(v);
if(tu!=tv)
{
f[tv]=tu;//tv认tu为老大。
//tv的小弟(包括自己)归了tu
vis[tu]+=vis[tv];
}
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
if(n==0&&m==0)
break;
int i,x;
init(n);
while(m--)
{
scanf("%d",&x);
for(i=0;i<x;i++)
scanf("%d",&a[i]);
for(i=0;i<x-1;i++)
Merge(a[i],a[i+1]);
}
printf("%d\n",vis[find(0)]);
}
return 0;
}