B - The Suspects -poj 1611
病毒扩散问题,SARS病毒最初感染了一个人就是0号可疑体,现在有N个学生,和M个团队,只要团队里面有一个是可疑体,那么整个团队都是可疑体,问最终有多少个人需要隔离...
再简单不过的并查集,只需要不断的合并每一行就行可,到最后查询一个所有与0相同的树根就行了
//////////////////////////////////////////////////////////////////
#include<stdio.h>
const int maxn = 100005;
int f[maxn];
int Find(int x)
{
if(f[x] != x)
f[x] = Find(f[x]);
return f[x];
}
int main()
{
int N, M;
while(scanf("%d%d", &N, &M), N+M)
{
int i, u, v, T;
for(i=0; i<N; i++)
f[i] = i;
while(M--)
{
scanf("%d%d", &T, &u);
u = Find(u);
while(--T)
{
scanf("%d", &v);
v = Find(v);
f[v] = u;
}
}
int ans = 1;
u = Find(0);
for(i=1; i<N; i++)
{
if(Find(i) == u)
ans++;
}
printf("%d\n", ans);
}
return 0;
}
const int maxn = 100005;
int f[maxn];
int Find(int x)
{
if(f[x] != x)
f[x] = Find(f[x]);
return f[x];
}
int main()
{
int N, M;
while(scanf("%d%d", &N, &M), N+M)
{
int i, u, v, T;
for(i=0; i<N; i++)
f[i] = i;
while(M--)
{
scanf("%d%d", &T, &u);
u = Find(u);
while(--T)
{
scanf("%d", &v);
v = Find(v);
f[v] = u;
}
}
int ans = 1;
u = Find(0);
for(i=1; i<N; i++)
{
if(Find(i) == u)
ans++;
}
printf("%d\n", ans);
}
return 0;
}