疑似病人(并查集)

17 篇文章 0 订阅

Link:点击打开链接


疑似病人

Time Limit 1000ms

Memory Limit 65536K

description

严重急性呼吸系统综合症(SARS),是一个未知的非典型性肺炎的病。在2003年三月中旬被公认为全球的威胁。为了减少传播给他人的可能,最好的策略是把疑似病人与其他人分隔开来。       
   在Not-Spreading-Your-Sickness大学(中山),有许多学生团体。 同一组的学生经常互相交往,学生可以参加多个团体。为了减少“非典”传播的可能,Not-Spreading-Your-Sickness大学搜集所有学生团体的学生会员名单,并且使下列规则作为他们的标准操作规程(SOP)。
   一旦一个会员是一个嫌疑人,在团体所有成员都成为嫌疑人。然而,他们发现这并不容易确认学生就是疑似病人。你的任务是编写一个程序,发现所有的疑似病人。

							

input

输入多组数据。每个测试数据始于两整数n和m,n是学生的数量,m是团体的个数。你可能认为0 < n < = 30000和0 < = m < = 500。每一位学生都被编上一个从0到n-1的独特的数,并且学生0是公认的疑似病人。该行后面紧接是每个团体的成员名单,每个团队一行。每一行的第一个数k代表该团体的成员人数。之后是k个数据,代表该团体的学生。所有在一行的数据之间至少用一个空格隔开。
案例由n = 0,m = 0表示结束的输入,且不需要处理。

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

hint

source


#include<stdio.h>
int n,m,pre[30000],rank[30000];
void init()
{
    int i;
    for(i=0;i<n;i++)
    {
       pre[i]=i;
       rank[i]=1;
    }
}
int find(int root)
{
   int son,tmp;
   son=root;
   while(root!=pre[root])
   {
     root=pre[root];
   }
   while(son!=root)
   {
     tmp=pre[root];
     pre[son]=root;
     son=tmp;
   }
   return root;
}
void join(int root1,int root2)
{
	int x,y;
	x=find(root1);
	y=find(root2);
	if(x!=y)
	{
		if(x<y)
		{
			pre[y]=x;
			rank[x]+=rank[y];
		}
		else
		{
			pre[x]=y;
			rank[y]+=rank[x];
		}
	}
}
int main()
{
	int k,t,a;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		if(n==0&&m==0)
		break;
		init();
		while(m--)
		{
			scanf("%d",&k);
			t=-1;
			while(k--)
			{
				scanf("%d",&a);
				if(t!=-1)
				join(a,t);
				t=a;
			}
		}
		printf("%d\n",rank[0]);
	}
	return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林下的码路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值