POJ 1611 The Suspects( 并查集)
2016-05-31 14:26
239 查看
题目:
严重急性呼吸系统综合症( SARS), 一种原因不明的非典型性肺炎,从2003年3月中旬开始被认为是全球威胁。为了减少传播给别人的机会, 最好的策略是隔离可能的患者。 在Not-Spreading-Your-Sickness大学( NSYSU), 有许多学生团体。同一组的学生经常彼此相通,一个学生可以同时加入几个小组。为了防止非典的传播,NSYSU收集了所有学生团体的成员名单。他们的标准操作程序(SOP)如下: 一旦一组中有一个可能的患者, 组内的所有成员就都是可能的患者。然而,他们发现当一个学生被确认为可能的患者后不容易识别所有可能的患者。你的工作是编写一个程序, 发现所有可能的患者。
这道题的思路十分简单是裸的并查集:
严重急性呼吸系统综合症( 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; }
相关文章推荐
- Linux C函数参考手册(PDF版)
- C#数据结构之顺序表(SeqList)实例详解
- C# partial关键字说明
- Lua教程(十七):C API简介
- 简单谈谈lua和c的交互
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- C#中的委托数据类型简介
- C#编写的艺术字类实例代码
- C#实现打造气泡屏幕保护效果
- 举例讲解C#编程中委托的实例化使用
- 使用C#代码获取存储过程返回值
- C++中explict关键字用法
- C/C++数据对齐详细解析
- 利用C语言来求最大连续子序列乘积的方法
- 数据结构之Treap详解