HDU 1232 畅通工程 (并查集)
2014-08-09 12:52
253 查看
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1232
题目意思: 给你两两连通的城市编号,需要所有城市连在一起,问你最少还需要建设多少条路。
分析:并查集的运用。
初始化完毕之后,对该动态连通图有几种可能的操作:
查询节点属于的组
数组对应位置的值即为组号
判断两个节点是否属于同一个组
分别得到两个节点的组号,然后判断组号是否相等
连接两个节点,使之属于同一个组
分别得到两个节点的组号,组号相同时操作结束,不同时,将其中的一个节点的组号换成另一个节点的组号
获取组的数目
初始化为节点的数目,然后每次成功连接两个节点之后,递减1
题目意思: 给你两两连通的城市编号,需要所有城市连在一起,问你最少还需要建设多少条路。
分析:并查集的运用。
初始化完毕之后,对该动态连通图有几种可能的操作:
查询节点属于的组
数组对应位置的值即为组号
判断两个节点是否属于同一个组
分别得到两个节点的组号,然后判断组号是否相等
连接两个节点,使之属于同一个组
分别得到两个节点的组号,组号相同时操作结束,不同时,将其中的一个节点的组号换成另一个节点的组号
获取组的数目
初始化为节点的数目,然后每次成功连接两个节点之后,递减1
#include<stdio.h> #include<cmath> #include<iostream> #include<algorithm> #include<string.h> #include<queue> using namespace std; #define MAX 2000 int father[MAX]; int find(int x) //并查集 递归查找根节点 { while(father[x] != x) { x = father[x]; } return x; } void Merge(int a, int b) { int aa = find(a); int bb = find(b); if(aa == bb) return ; else father[aa] = bb;//给不同根的放在同个根下 } int main() { int i,m,j,n; int city1,city2; while(scanf("%d",&n) != EOF && n != 0 ) { scanf("%d",&m); for(i=1; i<=n; i++) { father[i] = i; } for(i=1;i<=m;i++) { scanf("%d%d",&city1,&city2); Merge(city1,city2); } int count = 0; for(i=1;i<=n;i++) { if(father[i] == i) count++; } printf("%d\n",count-1); } return 0; }
相关文章推荐
- HDU 1232 畅通工程 最小强连通通路-并查集
- HDU--1232--畅通工程--并查集
- HDU-畅通工程-1232(并查集)How Many Tables(1213)
- HDU 1232 畅通工程(并查集)
- hdu 1232 畅通工程(并查集)
- hdu 1232 畅通工程(并查集)
- HDU--1232 -- 畅通工程 [并查集最简单应用]
- 畅通工程_hdu_1232(并查集)
- hdu 1232 畅通工程 (并查集)
- hdu 1232 畅通工程(并查集)
- 图论基础之并查集的简单看法:HDU 1232 畅通工程&&More is better
- hdu 1232 畅通工程【并查集入门】
- hdu 1232 畅通工程 最小生成树 并查集
- 畅通工程_hdu_1232(并查集)
- HDU 1232 畅通工程 (并查集)
- HDU_1232 畅通工程(并查集)
- hdu 1232 畅通工程(并查集)
- HDU 1232 畅通工程(并查集)
- hdu 1232 畅通工程并查集
- HDU 1232 畅通工程(并查集)