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

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

问题链接:

问题描述:参见上述链接

问题分析:这是一个最小生成树的为问题,解决的有Kruskal(克鲁斯卡尔)和Prim(普里姆) 算法。

程序说明:本程序使用Kruskal算法实现。有关最小生成树的问题,使用克鲁斯卡尔算法更具有优势,只需要对所有的边进行排序后处理一遍即可。程序中使用了并查集,用来判定加入一条边后会不会产生循环。程序中,图采用边列表的方式存储,按边的权从小到大顺序放在优先队列中,省去了排序。

AC的程序如下:

/* HDU1879 继续畅通工程 */#include 
#include
#include
using namespace std;const int MAXN = 100;// 并查集int v[MAXN+1];class UF {public: UF() {} // 压缩 int Find(int x) { if(x == v[x]) return x; else return v[x] = Find(v[x]); } bool Union(int x, int y) { x = Find(x); y = Find(y); if(x == y) return false; else { v[x] = y; return true; } } void reset(int n) { for(int i=0; i<=n; i++) v[i] = i; }};struct edge { int src, dest, cost; bool operator < (const edge& n) const { return cost > n.cost; }};int main(){ int n, ecount, status; UF uf; edge e; while(scanf("%d", &n) != EOF && n) { priority_queue
q; // 优先队列,用于存储边列表 uf.reset(n); ecount = n * (n - 1) / 2; while(ecount--) { scanf("%d%d%d%d", &e.src, &e.dest, &e.cost, &status); if(status == 1) uf.Union(e.src, e.dest); else q.push(e); } // Kruskal算法:获得最小生成树 int ans=0, count=0; while(!q.empty()) { e = q.top(); q.pop(); if(uf.Union(e.src, e.dest)) { count++; ans += e.cost; } if(count == n - 1) break; } // 输出结果 printf("%d\n", ans); } return 0;}

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

你可能感兴趣的文章
记一次omi的项目之旅
查看>>
Android API级别、代号、发布时间及平台亮点整理
查看>>
LLDP(链路层发现协议)
查看>>
Ubuntu14 添加程序启动
查看>>
我的友情链接
查看>>
windows网络安全以及常见网络***方式
查看>>
警告 初始化默认驱动器时出错“找不到运行 Active Directory Web 服务的默认服务器。”...
查看>>
JS字符串转换数字
查看>>
Journey源码分析二:整体启动流程
查看>>
七、MySQL中的字符集 - 系统的撸一遍MySQL
查看>>
使用IntelliJ IDEA开发SpringMVC网站(四)用户管理
查看>>
js 验证中文
查看>>
Linux下运行java DES AES加解密
查看>>
牛津词典 2018 年度词汇 ——「有毒」!
查看>>
Android Arcface人脸识别sdk使用工具类
查看>>
android studio单个工程文件的代理设置
查看>>
我的友情链接
查看>>
一行命令获取当前JVM所有可设置的参数以及当前默认值
查看>>
Linux mint 14下的powerDNS+mysql+powerAdmin搭建个性DNS域名解析服务器
查看>>
Red Hat EnterPrise Linux 5.4下web服务器的综合使用(普通站点、虚拟主机、安全性、...
查看>>