题目链接
题目大意:
有N个农场,M条路连通各个农场,要求走遍全部的农场,且每走1单位长度就要消耗一单位水,每到一个农场就可以补充水,求在所走的总路径最短的情况下最小的水箱容量。
解题思路:
寻找最小生成树中的最长边,下面代码中使用的是Kruskal算法
AC代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define INF 0x3fffffff
#define maxn 2001
#define maxm 10001
int n, m;//顶点个数 边个数
struct edge {
int u, v, w;
}e[maxm];
bool cmp(edge a, edge b) { return a.w < b.w; }
int tree[maxn];
int findroot(int a) {
if (tree[a] == -1)return a;
else {
int tmp = findroot(tree[a]);
tree[a] = tmp;//路径压缩
return tmp;
}
}
bool hebing(int a, int b) {
a = findroot(a);
b = findroot(b);
if (a != b) {
tree[a] = b;
return true;
}
return false;
}
void init(int x) {
for (int i = 1; i <= x; i++) {
tree[i] = -1;
}
}
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
init(n);
int u, v, w;
for (int i = 1; i <= m; i++) {
scanf("%d%d%d", &u, &v, &w);
e[i].u = u;
e[i].v = v;
e[i].w = w;
}
sort(e + 1, e + 1 + m, cmp);
int ans = 0;
for (int i = 1; i <= m; i++) {
if (hebing(e[i].u, e[i].v)) {
ans = max(ans, e[i].w);
}
}
cout << ans << endl;
}
return 0;
}