您的位置:首页 > 理论基础 > 数据结构算法

POJ 1611 The Suspects( 并查集)

2016-05-31 14:26 239 查看
题目:

严重急性呼吸系统综合症( SARS), 一种原因不明的非典型性肺炎,从2003年3月中旬开始被认为是全球威胁。为了减少传播给别人的机会, 最好的策略是隔离可能的患者。 在Not-Spreading-Your-Sickness大学( NSYSU), 有许多学生团体。同一组的学生经常彼此相通,一个学生可以同时加入几个小组。为了防止非典的传播,NSYSU收集了所有学生团体的成员名单。他们的标准操作程序(SOP)如下: 一旦一组中有一个可能的患者, 组内的所有成员就都是可能的患者。然而,他们发现当一个学生被确认为可能的患者后不容易识别所有可能的患者。你的工作是编写一个程序, 发现所有可能的患者。

这道题的思路十分简单是裸的并查集:

# include<stdio.h>
# include<stdlib.h>
int b[30000],a[510][3010],f[30000],n;
int lily2(int x){//找他的祖先节点
if(f[x]==0 ||f[x]==x)return x;
f[x]=lily2(f[x]);
return f[x];
}
void lily(int x,int y){//合并两个并查集
if(lily2(x)!=lily2(y)){
f[lily2(x)]=lily2(y);
}
}
int main(){
int m,i,j,k,ans=0;
while(1){
ans=0;
scanf("%d%d",&n,&m);//读入
if(n==0 &&m==0)break;
for(i=1;i<=n;i++)f[i]=i;
for(i=1;i<=m;i++){
scanf("%d",&k);
scanf("%d",&a[i][1]);
a[i][1]+=1;
for(j=2;j<=k;j++){
scanf("%d",&a[i][j]);
a[i][j]+=1;//我习惯从一开始,所以每个加一
lily(a[i][1],a[i][j]);//将在同一个小组的放进同一个并查集
}

}

for(i=1;i<=n;i++)if(lily2(1)==lily2(i))ans++;//如果和零在一个并查集则可能传染
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj c 数据结构 并查集