畅通工程之最低成本建设问题 (30分)
某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了有可能建设成快速路的若干条道路的成本,求畅通工程需要的最低成本。
输入格式:
输入的第一行给出城镇数目N (1<N≤1000)和候选道路数目M≤3N;随后的M行,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号(从1编号到N)以及该道路改建的预算成本。
输出格式:
输出畅通工程需要的最低成本。如果输入数据不足以保证畅通,则输出“Impossible”。
输入样例1:
6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3
输出样例1:
12
输入样例2:
5 4
1 2 1
2 3 2
3 1 3
4 5 4
输出样例2:
Impossible
这道题显然是最小生成树,学过数
据结构的话肯定是学过的,主要问
题在于你还记得吗…
这道题我用的是克鲁斯卡尔算法,定义了一个结构体数组,用来把每一个边都存起来,同时被存放的还有两个顶点以及边权.因为克鲁斯卡尔算法是每次从最小的边权里拿出来一个,所以把结构体数组按照边权排序.最后只要新拿到的边的两个顶点不在同一个集合内,也就是未曾搭建公路以使这两个顶点联通,那么就通过并查集里的join()函数让两个点联通,同时让ans加上边权.如果最终答案并不能使得图联通,也没有关系,只需要判断是否所有顶点都在同意集合内即可.
说实话,我并查集和克鲁斯卡尔算法早已经忘了,不过好在有一个代码模板文档,里面不讲述算法如何使用,只给算法的实现代码,靠着这个文档,我竟然做出来了这道题.
//
// Created by TIGA_HUANG on 2020/9/24.
//#include <iostream>
#include <algorithm>using namespace std;int pre[1010]; //存放第i个元素的父节点
int union_search(int root) { //查找根结点int son, tmp;son = root;while (root != pre[root]) //寻找根结点root = pre[root];while (son != root) { //路径压缩tmp = pre[son];pre[son] = root;son = tmp;}return root;
}void join(int root1, int root2) { //判断是否连通,不连通就合并int x, y;x = union_search(root1);y = union_search(root2);if (x != y) //如果不连通,就把它们所在的连通分支合并pre[x] = y;
}int N, M;
struct Edge {int a, b;int length;
} edge[3005];bool operator<(Edge &x, Edge &y) {return x.length < y.length;
}int ans;void kruskal() {ans = 0;for (int i = 0; i < M; ++i) {if (union_search(edge[i].a) != union_search(edge[i].b)) {join(edge[i].a, edge[i].b);ans += edge[i].length;}}
}
void init() {for (int i = 0; i <= N; ++i) {pre[i] = i;}
}
int main() {cin >> N >> M;for (int i = 0; i < M; ++i) {cin >> edge[i].a >> edge[i].b >> edge[i].length;}sort(edge, edge + M);init();kruskal();bool flag = true;for (int i = 2; i <= N; ++i) {if (union_search(i - 1) != union_search(i)) {flag = false;break;}}if (flag) {cout << ans << '\n';} else {cout << "Impossible\n";}return 0;
}
这是我参考的代码模板文档,说是参考几乎就是把里面的代码来了个复制粘贴
畅通工程之最低成本建设问题 (30分)相关推荐
- 畅通工程之最低成本建设问题(30 分)
这个题目就是一个最小生成树,如果无法构成就输出impossible ,就是构成最小生成树的时候,每选择一条边然后加加,最后统计是否有n-1条就可以. 最小生成树的讲解在我的其他的博客中有提到 #inc ...
- PTA5-2 畅通工程之最低成本建设问题 (克鲁斯卡尔)
某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出"畅通工程"的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通 ...
- 7-50 畅通工程之局部最小花费问题 (35 分)(思路加详解)来呀兄弟们冲呀呀呀呀呀呀呀
一:题目 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出"畅通工程"的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要 ...
- 7-3 公路村村通(30 分)
7-5 畅通工程之最低成本建设问题(30 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出"畅通工程"的目标:使整个地区任何两个城镇间都可以实现快速交 ...
- 畅通工程 HDU - 1863
省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道 ...
- 畅通工程//最小生成树prim
题目: 畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 【1863】畅通工程 (HDU)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 题目1024:畅通工程
/* 题目描述:省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建 ...
- HDUOJ---1863畅通工程
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
最新文章
- 汇编试验十五:安装新的int 9中断例程
- Laravel中使用模型对数据进行操作
- python组合数据类型有哪些_Python学习之组合数据类型
- session的存储方式和配置
- 数据结构——字符串(未完)
- 贵州·中国南方数据中心示范基地获批
- 各种快速幂(qaq)
- ARC082F - Sandglass(思维)
- GDKOI2021总结
- 红帽RHEL8和RHEL7有什么区别?
- Oracle变异表解决方法--ORA-04091错误
- 瑞星正版序列号,得来全不费功夫!Google搜索技巧
- 在Linux下安装和使用MySQL
- 埃森哲:AI成新生产要素,2035年将中国经济增速提高1.6% | 附下载
- 64码高清电视 android版,64体育app
- CentOS停更;阿里发布全新操作系统(Anolis OS),用后直呼:牛X
- 计算机职业生涯测评,皮纹检测职业版——职业生涯规划指南测评系统
- NVIDIA Geforce显卡和AMD Radeon系列显卡知识
- VMware vCenter Server 8.0U1 发布 - 集中式管理 vSphere 环境
- git 提交报错 Incorrect username or password ( access token )