博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU1232 畅通工程
阅读量:5954 次
发布时间:2019-06-19

本文共 1382 字,大约阅读时间需要 4 分钟。

问题链接:

问题简述:输入n和m,分别表示城镇的数量和城镇间道路的数量。再输入m个数对s和d表示城镇s到d有道路连通。问还需要修多少条道路才能够把这些城镇都连通起来。

问题分析:这是一个有关图的连通性问题,可以用并查集来解决。并查集中,连通的各个结点都会指向相同的根。

程序说明:程序中,构建一个用并查集,使得相互连通的子图指向相同的根,发现到两个互不相连的子图时,增加一条边使之相连。

AC的程序如下:

/* HDU1232 畅通工程 */#include 
#include
using namespace std;// 并查集类class UF {private: vector
v;public: UF(int n) { for(int i=0; i<=n; i++) v.push_back(i); } int Find(int x) { for(;;) { if(v[x] != x) x = v[x]; else return x; } } bool Union(int x, int y) { x = Find(x); y = Find(y); if(x == y) return false; else { v[x] = y; return true; } }};int main(){ int n, m, src, dest, root, count; while(cin >> n && n != 0) { UF uf(n); cin >> m; // 输入边(城镇道路),构造并查集 while(m--) { cin >> src >> dest; if(uf.Find(src) != uf.Find(dest)) uf.Union(src, dest); } // 逐个结点(城镇)检查是否联通,如果不联通则修一条道路使其联通 count = 0; root = uf.Find(1); for(int i=2; i<=n; i++) if(uf.Find(i) != root) { uf.Union(i, 1); count++; } // 输出结果 cout << count << endl; } return 0;}

转载于:https://www.cnblogs.com/tigerisland/p/7564122.html

你可能感兴趣的文章
DataGridView在vb.net中的操作技巧
查看>>
PMP考试冲刺进行中。。。
查看>>
大换血的代价
查看>>
Learn in FCC(3)
查看>>
RunLoop--
查看>>
chrome 2行换行省略号 ... text-ellipse
查看>>
C语言第四次作业
查看>>
Java学习-集合的理解
查看>>
iOS验证码倒计时(GCD实现)
查看>>
iOS中的过滤器和正则表达式(NSPredicate,NSRegularExpression)
查看>>
canvas和svg
查看>>
结对:复利美化版
查看>>
HDU_2689_Sort it
查看>>
urllib模块使用笔记
查看>>
mysql 连接慢的问题(超过了1秒)
查看>>
Linux嵌入式GDB调试环境搭建
查看>>
java分析jvm常用指令
查看>>
【Linux】Linux 在线安装yum
查看>>
oracle 管理操作 (转)
查看>>
DEV 等待窗口
查看>>