HDU1213-How Many Tables 并查集
2015-08-21 09:19
239 查看
题目链接:HDU1213-How Many Tables
若有不懂并查集的,我推荐一篇博客,个人认为写的非常好,内容很详细。认真的去看就一定能把并查集的思想弄懂,里面也有模板代码。
博客地址:/article/2376314.html
题目描述:首先有一个数T,是测试数据的组数。每组测试数据第一行输入N和M,代表有N个人会参加Party。接下来是M行,每行有两个数a和b,代表a和b认识。
同时,如果a和b认识,b和c认识,那么a,b,c就算互相认识。每个人只能和互相认识的热人在同一桌,如果没有则单独一桌。求最少要多少张桌子。
思路:并查集。将每对认识的人都连在一起,并让他们都和根节点直接连在一起。最后数出有多少个父节点是他本身的结点个数就行了。
代码:
若有不懂并查集的,我推荐一篇博客,个人认为写的非常好,内容很详细。认真的去看就一定能把并查集的思想弄懂,里面也有模板代码。
博客地址:/article/2376314.html
题目描述:首先有一个数T,是测试数据的组数。每组测试数据第一行输入N和M,代表有N个人会参加Party。接下来是M行,每行有两个数a和b,代表a和b认识。
同时,如果a和b认识,b和c认识,那么a,b,c就算互相认识。每个人只能和互相认识的热人在同一桌,如果没有则单独一桌。求最少要多少张桌子。
思路:并查集。将每对认识的人都连在一起,并让他们都和根节点直接连在一起。最后数出有多少个父节点是他本身的结点个数就行了。
代码:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAXN = 1111; int T,N,M; int x,y,ans; int father[MAXN]; void Initial() { ans=0; for(int i=1;i<=N;i++)//一开始让他们的父节点等于自身 father[i]=i; } int Find(int x) { int r=x; while(r!=father[r])r=father[r];//找连通了x的根节点r int i=x,j; while(i!=r) { j=father[i]; father[i]=r; i=j; } return r;//返回找到的根节点r } void Union(int x,int y) { int xx=Find(x),yy=Find(y); if(xx!=yy)//现在已知x和y认识,若根节点xx和yy不同,则让他们相连,他们也互相认识 father[xx]=yy; } int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&N,&M); Initial(); while(M--) { scanf("%d%d",&x,&y); Union(x,y);//每读入一组数,都让它们和根节点直接相连 } for(int i=1;i<=N;i++)//计算有多少个根节点就是答案了 if(father[i]==i)ans++; printf("%d\n",ans); } return 0; }
相关文章推荐
- Code(组合数学)
- 小谈导数、梯度和极值
- Phaser开源2d引擎 html5游戏框架中文简介
- Code(组合数学)
- 情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
- 年末最代码部分源码大出血分享-freemarker,bootstrap,springdata jpa分页代码
- 存储器层次结构
- 省市区js(可以得到省、市、区的行政代码和名称)
- codeforces 111B B. Petya and Divisors(数论)
- 2015-8,第二期培训跟进表
- Linux压缩与解压缩命令
- 剖析Python的Tornado框架中session支持的实现代码
- Hadoop技术内幕:深入解析MapReduce架构设计与实现原理
- Android之弹出多级菜单
- DOC命令删除文件和文件夹
- java泛型总结
- 猫猫学iOS 之第一次打开Xcode_git配置,git简单学习
- 本地机apache配置基于域名的虚拟主机详解
- 九度oj-1109-连通图
- Hibernate ORM 5.0 正式发布,支持 Java 8