关闭

POJ 1611 The Suspects( 并查集)

标签: pojc数据结构并查集
291人阅读 评论(0) 收藏 举报
分类:

题目:

严重急性呼吸系统综合症( 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;
}
4
2

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5758次
    • 积分:487
    • 等级:
    • 排名:千里之外
    • 原创:38篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论