题意:sars感染者呆过的每一个group的所有人都被认为是感染者,要求所有可能被感染的人数。
题解: 并查集
#include <cstdio>
#include <memory>
int father[30001], num[30001], r[30001]; /* 数组r表示秩的大小 */
int n,m;
void make_set()
{
for ( int i = 0; i < n; ++i )
{
father[i] = i;
num[i] = r[i] = 1;
}
}
int find_set ( int x )
{
if ( father[x] != x )
father[x] = find_set(father[x]);
return father[x];
}
void Union ( int x, int y )
{
int fx = find_set(x);
int fy = find_set(y);
if ( fx == fy )
return;
if ( r[x] > r[y] ) /*将秩小的树的根节点变为秩较大的树的子节点*/
{
father[fy] = fx;
num[fx] += num[fy];
}
else
{
father[fx] = fy;
num[fy] += num[fx];
}
if ( r[fx] == r[fy] )
r[fy]++;
}
int main()
{
int i,k,first,next;
while ( scanf("%d%d",&n,&m) && (m+n) )
{
make_set();
while ( m-- )
{
scanf("%d",&k);
if ( k > 0 ) scanf("%d",&first);
for ( i = 1; i < k; i++ )
{
scanf("%d", &next);
Union(first,next);
}
}
printf("%d\n",num[find_set(0)]);/*0所在集合的数量即为要求的量*/
}
return 0;
}