现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。
输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−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
输出样例:
12
#include <vector>
#include <stack>
#include <queue>
#include <string>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <bitset>
#include <set>
#include <map>
#include<functional>
#define MAX_V 1001
#define MAX_E 3001
#define INF 10000000
using namespace std;
struct edge {
int to, cost; // 终点 距离
};
typedef pair<int , int> p; // first 是距离 second 目标顶点
int V; // 顶点数
vector <edge> G[MAX_V]; // 下标起点
bool used[MAX_V]; // 标记是否访问
int Prim() {
priority_queue <p, vector<p>, greater<p> > que;
for (int i = 0; i < V; i++) {
used[i] = false;
}
int cnt = V; // 标记所有点是否被访问
que.push(p(0, 0)); // 从零顶点开始加入集合
int res = 0; // 长度
while (!que.empty() && cnt) {
p temp = que.top();
que.pop();
int v = temp.second;
if (used[v]) continue;
res += temp.first;
// cout << v + 1 << " " << temp.first << endl;
cnt--;
used[v] = true;
for (int u = 0; u < G[v].size(); u++) {
if (!used[G[v][u].to]) {
que.push(p(G[v][u].cost, G[v][u].to));
}
}
}
if (cnt) return -1;
else return res;
}
int main() {
int M;
cin >> V >> M;
if (M >= V - 1) {
int x, y, z;
for (int i = 0; i < M; i++) {
cin >> x >> y >> z;
G[x - 1].push_back(edge{y - 1, z});
G[y - 1].push_back(edge{x - 1, z});
}
cout << Prim() << endl;
}
else {
cout << -1 << endl;
}
// system("pause");
return 0;
}