杭电oj1213——How Many Tables(并查集)
2017-04-25 23:40
781 查看
题意:
一个人举办聚会,让计算需要几张桌子,认识的人坐在一起,例如:A认识B,B认识C,那么认为A也认识C。
题目链接:
(http://acm.hdu.edu.cn/showproblem.php?pid=1213)
分析:
主要用到并查集。
并查集详细用法:
(http://blog.csdn.net/luomingjun12315/article/details/47373345)
代码如下:
一个人举办聚会,让计算需要几张桌子,认识的人坐在一起,例如:A认识B,B认识C,那么认为A也认识C。
题目链接:
(http://acm.hdu.edu.cn/showproblem.php?pid=1213)
分析:
主要用到并查集。
并查集详细用法:
(http://blog.csdn.net/luomingjun12315/article/details/47373345)
代码如下:
#include <iostream> #include<stdio.h> using namespace std; int node[1005];//每个节点 int Rank[1005];//树的高度 void init(int n)//初始化 { for(int i=1;i<=n;i++) { node[i]=i; Rank[i]=0; } } int Find(int n)//查找当前元素所在树的根节点(代表元素) { if(n==node ) return n; return Find(node ); } void unite(int x,int y)//合并元素x, y所处的集合 { x=Find(x); y=Find(y); if(x==y) return; //判断两棵树的高度,然后在决定谁为子树 if(Rank[x]<Rank[y]) { node[x]=y; } else { node[y]=x; if(Rank[x]==Rank[y]) Rank[x]++; } } int main() { int t; scanf("%d",&t); while(t--) { int n,m,x,y; scanf("%d%d",&n,&m); init(n); for(int i=0;i<m;i++) { scanf("%d%d",&x,&y); unite(x,y); } int num=0; for(int i=1;i<=n;i++) { if(node[i]==i) num++; } cout<<num<<endl; } }
相关文章推荐
- 杭电hdu 1213 How Many Tables并查集
- 杭电 hdu 1213 How Many Tables (并查集,简单题)
- 杭电1213 How Many Tables(并查集找根节点)
- hdu杭电1213 How Many Tables【并查集】
- 杭电1213 How Many Tables(并查集)
- 并查集-杭电1213-How Many Tables-难度1
- 杭电 1213 How Many Tables 并查集
- 杭电1213_How Many Tables——java(并查集)
- hdu 1213 (How Many Tables)(简单的并查集,纯模板)
- HDOJ 1213 How Many Tables——并查集
- HDU 1213 How Many Tables(并查集)
- HDU-1213 How Many Tables (并查集)
- hdu 1213 How Many Tables(并查集学习)
- HDU-#1213 How Many Tables (并查集)
- HDU 1213 How Many Tables (并查集)
- hdu 1213 How Many Tables(并查集)
- HDU-1213-How Many Tables(并查集)
- HDU 1213 How Many Tables 并查集入门
- 【HDOJ1213】How Many Tables[并查集模板题]
- HDU--1213--How Many Tables--并查集