POJ 1611 The Suspects(并查集)

2014年03月11日 11:17:28

阅读数:1027

POJ 1611 The Suspects(并查集)

http://poj.org/problem?id=1611

题意:

现在有n个学生(从0号到n-1号),其中0号学生是有可能非典的,只要和被怀疑有非典的学生在一个社团的学生都是有可能有非典的且需要被隔离,但是学校有很多社团,所以现在要你求一共有多少学生需要被隔离?

输入:多组实例.每个实例第一行n和m (0 <n <= 30000 and 0 <= m <= 500),表示学生从0到n-1号,接下来有m行,每行描述一个社团的所有成员.每行首先是一个k,表示该社团有k个成员,接下来是这k个成员的编号.当一组实例n=0且m=0时,表示输入结束.

输出:需要被隔离的学生数.

分析:

所有学生被处理前都是独立的连通分量,以自己作为根。只要读入一个社团,那么社团中所有的学生所属的连通分量都要合并成1个。不断这么处理,最终和0号学生在同一个连通分量的所有学生都是需要被隔离的。

AC代码(新)中用 根节点维护num[i]信息表示当前连通分量的节点数目,当所有节点合并完之后,只需要计算0号节点所在的连通分量的点数 输出即可。

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=30000+5;int fa[maxn];
int num[maxn];//根节点数目
int findset(int x)
{return fa[x]==-1? x:fa[x]=findset(fa[x]);
}
void bind(int u,int v)
{int fu=findset(u);int fv=findset(v);if(fu!=fv){num[fv] += num[fu];fa[fu] = fv;}
}int main()
{int n,m;while(scanf("%d%d",&n,&m)==2 && n){for(int i=0;i<n;i++){fa[i]=-1;num[i]=1;}while(m--){int k, u, v;scanf("%d%d",&k,&u);for(int i=1;i<=k-1;i++){scanf("%d",&v);bind(u,v);}}printf("%d\n",num[findset(0)] );}return 0;
}
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=30000+100;
int pa[MAXN];
int findset(int x)
{if(pa[x]==-1)return x;return pa[x]=findset(pa[x]);
}
void bind(int i,int j)
{int fa=findset(i);int fb=findset(j);if(fa!=fb)pa[fb]=fa;
}
int main()
{int n,m;while(scanf("%d%d",&n,&m)==2){int ans=1;if(n==0&&m==0)break;memset(pa,-1,sizeof(pa));while(m--)//读m组的成员{int k,first;scanf("%d",&k);if(k==0)continue;//以防k为0,即该组没人scanf("%d",&first);//读该组的第一个成员k--;while(k--){int a;scanf("%d",&a);bind(first,a);}}int g=findset(0);for(int i=1;i<n;i++){if(g == findset(i))ans++;}printf("%d\n",ans);}return 0;
}

计算一个连通分量中节点的个数的两种方法相关推荐

  1. Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数

    6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数.编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数 题目 题目描述 破题 代码 运行示例 题目 ...

  2. 多元统计分析matlab,MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法...

    MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法: 1.层次聚类hierarchical clustering 2.k-means聚类 这里用最简单的实例说明以下层次聚类原理和应用发 ...

  3. VB中FSO的调用的两种方法

    方法一:   Dim   objFso      Set   objFso   =   CreateObject("Scripting.FileSystemObject")    ...

  4. arcgis用python字段自动编号,arcgis中字段自动编号的两种方法

    <arcgis中字段自动编号的两种方法>由会员分享,可在线阅读,更多相关<arcgis中字段自动编号的两种方法(4页珍藏版)>请在人人文库网上搜索. 1.精选文档关于ARCGI ...

  5. Java中的string定义的两种方法和区别

    java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...

  6. WPF中在XAML中实现数据类型转换的两种方法

    WPF中在XAML中实现数据类型转换的两种方法 原文:WPF中在XAML中实现数据类型转换的两种方法 熟悉数据绑定的朋友都知道,当我们在Model中获取一个对象的数据,常常需要对其进行数据转换后显示在 ...

  7. python怎么清屏_python实现清屏的方法 Python Shell中清屏一般有两种方法。

    Python Shell 怎样清屏? Python Shell中清屏一般有两种方法. 奈何一个人随着年龄增长,梦想便不复轻盈:他开始用双手掂量生活,更看重果实而非花朵.--叶芝<凯尔特的搏暮&g ...

  8. Revit插件教学丨Revit中绘制斜楼板的两种方法?

    Revit插件教学丨Revit中绘制斜楼板的两种方法? 我们经常遇到一些斜楼板,很多朋友不知道如何画好楼板,经常在公众号留言说怎么画好楼板,怎么快速高效.但我相信很多玩Revit的玩家都很熟悉,今天和 ...

  9. 计算机word降序排列怎么做,word中怎么进行排序的两种方法

    word文档中表格除了作为我们的编辑和展示功能之外,还可以进行排序功能,十分方便,那么下面就由学习啦小编给大家分享下word中进行排序的技巧,希望能帮助到您. word中进行排序方法一: 步骤一:将光 ...

最新文章

  1. iOS 直播专题6-流媒体服务器
  2. Linux大文件处理,伪分区
  3. cs架构使用webservice靠谱嘛_使用点评eimele亦餐哪些味道的好吃?口碑靠谱吗?急想知道!...
  4. java ltpa_LTPA Cookie原理
  5. excel单元格内容合并
  6. python编程基础题答案_大学moocPython编程基础题目及答案
  7. mapreduce程序开发的一些总结
  8. 【thinkphp 5 在nginx 环境下路由无法生效(404 500错误 )的解决方法】
  9. idea创建springcloud项目_新手向,十分钟快速创建 Spring Cloud 项目
  10. verilog语法实例学习(3)
  11. python中pandas作用_Python Pandas滚动功能
  12. 计算机键盘上的每一个按键应用,电脑键盘按键都代表着什么意思?
  13. ASP模式“救星降临”?(转)
  14. 如何成为一名研发主管--关于个人、过程、工具和团队之一
  15. jQuery 梁桐老师笔记 - 选择器
  16. dw相对路径怎么改_Dreamweaver绝对路径和相对路径
  17. python打印列表元素_Python打印输出数组中全部元素
  18. 搜狗搜索图片查看器调用帮助
  19. LaTeX 中文排版
  20. mac 卸载pkg安装包

热门文章

  1. C++基础::shared_ptr 编程细节(一)
  2. python能做什么-学 Python 都用来干嘛的?
  3. python有什么用-python有什么用
  4. python怎么读取excel-python 读取 Excel
  5. python和c 的区别-python和c语言的主要区别总结
  6. python装饰器详解-python装饰器的详细解析
  7. micropython和python区别-MicroPython与Python速度对比
  8. python常用代码总结-Python基础常见问题总结(一)
  9. python学习网站-有哪些值得推荐的Python学习网站?
  10. h5 在线语音识别接口