您的位置:首页 > 其它

POJ-1611-The Suspects

2013-07-25 11:14 197 查看
题目大意是说有n个组,每个组有对应的人(一个人可能在多个组),若有一个人感染SARS,则对应组别的所有人都感染上SARS,题目要求你求出最终能感染此病毒的有多少人

思路:

我的做法是用并查集,把每个组也当作是一个点,则最多有500个点,人的编号就从501开始,在读取数据的时候把每个组内的人组标志设为组名,因为题目中说病毒从1号开始传播,所以最后只需要统计501号人相同的集合有多少人即可。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=40510;
int ans,n,m,p[maxn];
int find(int x)
{
if(p[x]==-1)
return x;
return p[x]=find(p[x]);
}
int main()
{
while(scanf("%d%d",&n,&m)&&(n+m))
{
ans=0;
memset(p,-1,sizeof(p));
for(int i=0;i<m;i++)
{
int k;
scanf("%d",&k);
for(int j=0;j<k;j++)
{
int ita;
scanf("%d",&ita);
ita+=501;
int x=find(i);
int y=find(ita);
if(x!=y)
p[x]=y;
}
}
int pos=find(501);
for(int i=501;i<=n+501;i++)
if(find(i)==pos)
ans++;
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: