题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量
解题思路:其实这个求最大边可以近似于求最短路,只要修改下找最短路更新的条件就可以了
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn = 1100;
const int inf = -10000000;//***这是使用dijkstra来解决最大生成树是需要改的地方.1)
int map[maxn][maxn];
int d[maxn];
int s[maxn];
int n, m;
/**
* dijkstra算法用于有向加权图的最短路径问题
*
* 有一个大神总结的很好(至少我个人比较赞同..):
* 用最小生成树算法来求最小边权和
* 用dijkstra算法将所有的最小值都存起来
*/
int dijkstra(int v) { //选择v作为源节点,利用dijkstra算法计算源节点v到各节点的最短路径
int i;
for (i = 1; i <= n; ++i) { //初始化
s[i] = 0; //s[i] = 0,表示i节点未被访问过
d[i] = map[v][i]; //将d[i]定义为源节点v到节点i的最短距离
}
int j;
for (i = 1; i < n; ++i) {//这里< 或者是 <= 都会AC
int mmin = inf;
int pos;
for (j = 1; j <= n; ++j) {
if (!s[j] && mmin < d[j]) {//***这是使用dijkstra来解决最大生成树是需要改的地方.2)
pos = j;
mmin = d[j];
}
}
s[pos] = 1;
for (j = 1; j <= n; ++j) {
if (!s[j] && (d[j]<min(d[pos],map[pos][j]))) {//***这是使用dijkstra来解决最大生成树是需要改的地方..3)
d[j] = min(d[pos],map[pos][j]);
}
}
}
return d[n]; //返回所要求的源节点到n节点的最短路径
}
int main() {
int t;
scanf("%d", &t);
int counter = 1;
while (t--) {
scanf("%d%d", &n, &m);
memset(map, 0, sizeof(map));
int i;
for (i = 1; i <= m; ++i) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
map[a][b] = map[b][a] = c;
}
printf("Scenario #%d:\n", counter++);
printf("%d\n\n", dijkstra(1));
}
return 0;
}