公路村村通
题目描述
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入
输入数据包括城镇数目正整数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
题意
MST裸题了,只是好久没敲了,,,
AC代码
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN= 1e4+10;
int n, m;
int par[MAXN];
void init() {
for(int i = 1; i <= MAXN; i++) par[i] = i;
}
int find(int x) {
if(x == par[x]) return x;
return par[x] = find(par[x]);
}
void unite(int x, int y) {
x = find(x);
y = find(y);
if(x != y)
par[x] = y;
}
struct node {
int x, y, z;
bool operator<(const node &r)const {
return z < r.z;
}
}p[MAXN];
int main() {
init();
cin >> n >> m;
for(int i = 1; i <= m; i++) cin >> p[i].x >> p[i].y >> p[i].z;
sort(p+1,p+1+m);
int sum = 0;
int k = 1;
for(int i = 1; i <= m; i++) {
if(find(p[i].x)!=find(p[i].y)) {
unite(p[i].x,p[i].y);
sum += p[i].z;
k++;
}
}
if(k!=n) cout << -1 << endl;
else
cout << sum << endl;
}