题目:
有N(2-2000)个农场,M(1-10000)条通路连通各个农场,长度不超109,要求遍历全部的农场,且每走1单位长度就要消耗一单位水,每到一个农场可以把自己的水充满,求最小的水箱容量。
样例输入
3 3 1 2 23 2 3 1000 1 3 43
样例输出
43
题解:题目的意思大概就是 找到 prime算法里面 边 最大的那一条,所以只需要记录每次迭代最大的那一条边即可。
关于prime的算法:
https://blog.csdn.net/lqcsp/article/details/14118871
源代码:
#include <iostream>
using namespace std;
const int maxn = 2010;
const int INF = 0x3f3f3f3f;
int n,m;
int map[maxn][maxn];
int vis[maxn],lowcast[maxn];
int prime() {
int ans = -1;
for(int i = 1; i <= n; i++) { //data initi
vis[i] = false;
lowcast[i] = map[1][i];
}
vis[1] = true; // the first index
for(int i = 1; i < n; i++) { //loop n - 1 times
int k ,min = INF;;
for(int j = 1; j <= n; j++) {
if(!vis[j] && lowcast[j] < min) {
min = lowcast[j];
k = j;
}
}
vis[k] = 1;
ans = ans > min ? ans : min; //rember largest cast
for(int i = 1; i <= n; i++) { // renew the lowcast
if( !vis[i] && lowcast[i] < min) { // find it from 1
lowcast[i] = map[k][i];
}
}
}
return ans;
}
int main() {
while(cin >> n >>m) {
int a,b,c;
for(int i = 1; i <= n; i++) { //初始化地图为无穷大
for(int j = 1; j <= n; j++) {
map[i][j] = INF;
}
}
for(int i = 0; i < m; i++) {
cin >> a >> b >> c;
map[a][b] = c;
map[b][a] = c;
}
cout << prime() <<endl;
}
return 0;
}