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

本文共 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/7564121.html

你可能感兴趣的文章
分享一些经典资源
查看>>
HDU-1723 Distribute Message
查看>>
6200 sdboot 测试版分析(一)
查看>>
WayOs扩展WAN口工具1.4隆重发布,同时发布BCM内置三天智能重启超级终端调试图...
查看>>
Java反编译插件Jdclipse导致Eclipse 3.7.2启动崩溃的解决方法
查看>>
关于Installshield中Ie8\Ie9\SQL Server 2008 R2 Native Client等Prq文件在线下载地址
查看>>
SQL Server 2008中增强的汇总技巧
查看>>
they're hiring
查看>>
几个 HTML 标签的用法
查看>>
《老罗Android开发视频教程-安卓巴士》(Android 开发)
查看>>
asp.net 伪静态 IIS设置后 直正HTML无法显示
查看>>
垃圾代码评析——关于《C程序设计伴侣》6.2(一)
查看>>
为 iPhone 和 iPad 自定义网站的主屏幕图标
查看>>
怎样快速搜索自己所需的资料?(90%的人不会使用此方法)[转]
查看>>
【Android】使用SearchView时软键盘不支持actionSearch的问题
查看>>
url请求返回结果测试工具(CURL)
查看>>
虚拟机安装教程
查看>>
java对文件的检索
查看>>
Marquee滚动字幕设置(转)
查看>>
linux系统下调度数据库类型资源库中的kettle job
查看>>