概述
n个城镇之间目前有一些道路连接,但道路都是年久失修的土道。现在政府准备将其中一些土道改造为标准公路,希望标准公路能够将所有城镇连通且总成本最小,但其中有一个城镇比较特殊,受地形等限制,最多只能有两条标准公路通过该镇。请编写程序,找出一种满足上述条件的、总成本最小的改造方案,若不存在改造方案,则亦能识别。假定道路是双向的。
输入格式:
输入包含多组数据。每组数据第一行是3个整数n、v和e,均不超过50,n为城镇数目,城镇编号0至n-1。v为最能有两条标准公路的城镇编号,e为现有的土路条数,接下来是e行表示每条道路信息,每行为3个非负整数a、b、c,表示城镇a和城镇b间现有一条道路,若将其改造为标准公路,成本为c。
输出格式:
对每组数据输出一行,为一个整数,表示满足要求的最小成本,若不存在改造方案,则输出-1。
输入样例:
5 0 8
0 1 1
0 2 1
0 3 1
0 4 1
1 4 100
1 2 100
2 3 100
3 4 100
5 0 4
0 1 1
0 2 1
0 3 1
0 4 1
输出样例:
202
-1
#include<iostream>
#include<algorithm>
using namespace std;
struct Edge {
int from;
int to;
int val;
}edge[51];
int parent[51];
int find(int x) {
int r = x;
if (parent[r] == r)
return r;
else
return parent[r] = find(parent[r]);
}
bool paixu(Edge a, Edge b) {
return a.val < b.val;
}
void merge(int x, int y) {
int a = find(x);
int b = find(y);
if (a != b)
parent[a] = b;
}
int main() {
int n, v, e;
while (cin >> n >> v >> e) {
int count = 0, ans = 0, num = 0;
for (int i = 0; i < n; i++)
parent[i] = i;
for (int i = 0; i < e; i++)
cin >> edge[i].from >> edge[i].to >> edge[i].val;
sort(edge, edge + e, paixu);
for (int i = 0; i < e; i++) {
int a = find(edge[i].from);
int b = find(edge[i].to);
if (a == b)
continue;
else {
if ((edge[i].from == v || edge[i].to == v) && count < 2) {
merge(edge[i].from, edge[i].to);
ans = ans + edge[i].val;
count++;
num++;
}
else if (edge[i].from != v && edge[i].to != v) {
merge(edge[i].from, edge[i].to);
num++;
ans = ans + edge[i].val;
}
if (num == n - 1)
break;
}
}
if (num == n - 1 && count <= 2)
cout << ans << endl;
else
cout << -1 << endl;
}
}
最后
以上就是无情冰淇淋为你收集整理的特殊最小成本修路的全部内容,希望文章能够帮你解决特殊最小成本修路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复