畅通工程

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 33818    Accepted Submission(s): 14964

Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。

Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input
 
3 31 2 11 3 22 3 41 32 3 20 100

Sample Output
 
3?

Source
浙大计算机研究生复试上机考试-2007年

问题链接:HDU1863 畅通工程。

问题描述:参见上文。

问题分析

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

程序说明

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

代码不够简洁,又写了一个简洁版。

AC的C++语言程序(简洁版)如下:

/* HDU1863 畅通工程 */#include <iostream>
#include <queue>
#include <stdio.h>using namespace std;const int N = 100;
int f[N + 1], cnt;void UFInit(int n)
{for(int i = 1; i <=n; i++)f[i] = i;cnt = n;
}int Find(int a) {return a == f[a] ? a : f[a] = Find(f[a]);
}bool Union(int a, int b)
{a = Find(a);b = Find(b);if (a != b) {f[a] = b;cnt--;return true;} elsereturn false;
}struct edge {int src, dest, cost;bool operator < (const edge& n) const {return cost > n.cost;}
};int main()
{edge e;int n, m;while(scanf("%d%d", &n, &m) != EOF && n) {priority_queue<edge> q;     // 优先队列,用于存储边列表UFInit(m);// 构建优先队列while(n--) {scanf("%d%d%d", &e.src, &e.dest, &e.cost);q.push(e);}// Kruskal算法:获得最小生成树int ans=0, count=0;while(!q.empty()) {e = q.top();q.pop();if(Union(e.src, e.dest)) {count++;ans += e.cost;}if(count == m - 1)break;}// 连通性判定,输出结果if(cnt == 1)printf("%d\n", ans);elseprintf("?\n");}return 0;
}

AC的C++语言程序如下:

/* HDU1863 畅通工程 */#include <iostream>
#include <queue>
#include <cstdio>using namespace std;const int MAXN = 100;// 并查集
int v[MAXN+1];
class UF {int length;
public:UF() {}// 压缩int Find(int x) {if(x == v[x])return x;elsereturn 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;}}// 唯一树根判定连通性bool isconnect() {int root = -1;for( int i=1 ; i<=length ; i++ )if(root == -1)root = Find(i);elseif(Find(i) != root)return false;return true;}void reset(int n) {length = 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()
{UF uf;edge e;int n, m;while(scanf("%d%d", &n, &m) != EOF && n) {priority_queue<edge> q;     // 优先队列,用于存储边列表uf.reset(m);// 构建优先队列while(n--) {scanf("%d%d%d", &e.src, &e.dest, &e.cost);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 == m - 1)break;}// 连通性判定,输出结果if(uf.isconnect())printf("%d\n", ans);elseprintf("?\n");}return 0;
}

HDU1863 畅通工程【Kruskal算法+并查集】相关推荐

  1. hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1233 模板题,kruskal求最小生成树. 并查集是个好东西啊  就是注意一点 输入边的信息时,角标 ...

  2. UVA10034 Freckles【Kruskal算法+并查集】

    In an episode of the Dick Van Dyke show, little Richie connects the freckles on his Dad's back to fo ...

  3. HDU1875 畅通工程再续【Kruskal算法+并查集】

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  4. HDU1233 还是畅通工程【Kruskal算法+并查集】

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...

  6. 还是畅通工程(1233 并查集+kruskal)

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  7. 最小生成树kruskal算法并查集版 C语言实现

    今天数据结构课讲了最小生成树的Kruskal算法和Prim算法,不过都只是概念,可能是怕他们听不懂吧,反正算法实现一概不讲...囧 下午抱着<算法导论>跑去图书馆看Kruskal算法,发现 ...

  8. 最小生成树KrusKal算法(并查集)

    洛谷p1111链接 克鲁斯卡尔算法的思路就是由森林变成树的过程,其中最主要的就是贪心和并查集的应用. 我们知道链接n个点需要n-1条边,这就满足的最后生成的是一颗树,而不是一个环.在这n-1条边的选择 ...

  9. 最小生成树Kruskal算法+并查集检查连通

    /* 10 6 1 2 6 1 3 1 1 4 5 2 3 5 2 5 3 3 4 5 3 5 6 3 6 4 4 6 2 5 6 6 */// 本例解决最小生成树问题 // 并查集来加快效率 // ...

最新文章

  1. SCRUM敏捷实践—任务看板
  2. Verilog以及VHDL所倡导的的代码准则
  3. spring service ,controller反向代理生成AOP代理类流程
  4. 详解Dart中如何通过注解生成代码
  5. [蓝桥杯2015初赛]移动距离
  6. 洛谷 P1101 单词方阵
  7. django 表单html5,我们如何在django管理表单中添加动态html5数据属性
  8. web程序前后台功能实现_好程序员web前端教程之JS继承实现方式解析
  9. 牛客网编程题06--取近似值
  10. linux运行bin not found,自己制作根文件后,程序-/bin/sh:XXX:not found错误
  11. 用Google XML Sitemaps为你的网站创建Sitemap
  12. 语言判断一个整数是奇数还是偶数_一个变量“存储”任意多的数 从“康托配对函数”聊开去...
  13. stimulsoft mysql_StimulSoft——将炫酷的报表写入你的应用程序
  14. ffmpeg vsync参数分析
  15. CodeForces 158B Taxi(代数算式解题)
  16. 关于Spring.split()踩坑
  17. 山东计算机网络期末试题,山东轻工业学院计算机网络期末试题A(13页)-原创力文档...
  18. 面经手册 · 开篇《面试官都问我啥》
  19. Hinton等谈深度学习十年;PyTorch落地Linux基金会的影响;机器学习界的“GitHub”|AI系统前沿动态
  20. J2ME游戏开发(从零开始)

热门文章

  1. 河流逻辑结构图生成方法
  2. golang 使用 consul 做服务发现
  3. 几种ELK常见的架构模式
  4. Genome2D官方博客及教程
  5. es和oracle,Oracle和Elasticsearch数据同步
  6. java ee 程序_第一个 JavaEE 应用程序 - JavaWeb 入门开发教程
  7. springboot 注解_springBoot注解大全
  8. C++小白课本练习1
  9. 文档服务器备份吗,本地资料和云服务器备份吗
  10. HarmonyOS DevEco Studio 配置本地模拟器