HDU-1232-畅通工程
2012-08-25 19:20
253 查看
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1232
/*
程序分析:
给你一些城市、城市之间的某些路,让你求最少还要再建多少条路才能实现城市与城市之间两两相通。
需要注意的是,两个城市之间可以有多条路,多条也当它一条处理。如果城市之间都没有路,需要建的路
就是城市的个数减一。
解决方法:
利用并查集的特性,把城市之间有路的合并为一个城市,最后判定有几个城市或者有几棵树就可以了。
结果也就是城市(树)数目减一,比如有三个城市就要有2条路来让他们互通! 具体看代码吧
*/
View Code
/*
程序分析:
给你一些城市、城市之间的某些路,让你求最少还要再建多少条路才能实现城市与城市之间两两相通。
需要注意的是,两个城市之间可以有多条路,多条也当它一条处理。如果城市之间都没有路,需要建的路
就是城市的个数减一。
解决方法:
利用并查集的特性,把城市之间有路的合并为一个城市,最后判定有几个城市或者有几棵树就可以了。
结果也就是城市(树)数目减一,比如有三个城市就要有2条路来让他们互通! 具体看代码吧
*/
View Code
#include<iostream> using namespace std; #define max 50001 int p[max]; bool k[max]; int find(int pos) { if(p[pos]==-1)return pos; return p[pos]=find(p[pos]); } int uni(int x,int y) { int a=find(x); int b=find(y); if(a==b)return 0; p[a]=b; return 1; } int main() { int temp; int a,b; int n,m; while(cin>>n&&n&&cin>>m) { //初始化 for(int i=1;i<=n;i++) { p[i]=-1; k[i]=0; } //输入 合并 for(int i=1;i<=m;i++) { cin>>a>>b; uni(a,b); } //标记 for(int i=1;i<=n;i++) { temp=find(i); k[temp]=1; } //统计 int add=0; for(int i=1;i<=n;i++) { if(k[i]==1) add++; } printf("%d\n",add-1); } return 0; }
相关文章推荐
- HDU 1232 畅通工程
- HDU 1232 畅通工程(并查集)
- hdu 1232 畅通工程 并查集 最小生成树
- Hdu 1232 畅通工程
- hdu 1232 畅通工程
- hdu 1232 畅通工程
- hdu1232 畅通工程
- hdu 1232 畅通工程(并查集算法)
- 【hdu 1232】 畅通工程
- hdu 1232 畅通工程
- hdu1232 畅通工程--并查集
- hdu 1232 畅通工程 解题报告
- HDU 1232 畅通工程 并查集
- HDU1232~畅通工程~并查集的应用~~
- hdu 1232 畅通工程
- HDU 1232 畅通工程 (并查集)
- HDU 1232 畅通工程 (并查集)
- HDU 1232 畅通工程(纯并查集)
- HDU 1232 畅通工程
- HDU 1232 畅通工程