08-图7 公路村村通(30 分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数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
作者: 陈越
单位: 浙江大学
时间限制: 400ms
内存限制: 64MB
代码长度限制: 16KB
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
struct Rode {
int StartPoint;
int EndPoint;
int Cost;
friend bool operator <(const Rode& r1, const Rode& r2)
{
return r2.Cost < r1.Cost;
}
};
int FindRoot(int index, vector<int> & v)
{
if (v[index] < 0) {
return index;
}
else {
return v[index] = FindRoot(v[index], v);
}
}
void Union(int root1,int root2, vector<int>& v)
{
v[root1] = root2;
}
int main()
{
//ifstream inFile("C:\\Users\\DELL\\Desktop\\in.txt");
int N;//城镇数目;
int M;//候选道路数目M(≤3N)
cin >> N >> M;
priority_queue<Rode, vector<Rode>> Q;
vector<int> v(N + 1, -1);
Rode R;
for (int i = 0; i < M; ++i) {
cin >> R.StartPoint >> R.EndPoint >> R.Cost;
Q.push(R);
}
int count = 0, mincost = 0;
while (count < N - 1 && Q.size()) {
Rode r = Q.top();
Q.pop();
int root1 = FindRoot(r.StartPoint, v);
int root2 = FindRoot(r.EndPoint, v);
if (root1 != root2) {
count++;
mincost += r.Cost;
Union(root1, root2, v);
}
}
if (count < N-1) {
cout << "-1" << endl;
}
else {
cout << mincost << endl;
}
// inFile.close();
system("pause");
return 0;
}