题意:给定一个无向图, 求1到n的所有路径中最大的承载量,承载量 = 一条路径中所有边权值的最小值

思路:spfa变形, 很巧妙, 初始化时把dis数组全部初始化为0, 然后把dis[s]设置为INF, 松弛操作时比较dis[v]与min(dis[u], val)的大小

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <utility>
using namespace std;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const int maxn = 1010;
bool vis[maxn];
int T, n, m, dis[maxn];
vector<P> G[maxn];
void spfa(int s) {
for (int i = 1; i <= n; i++) dis[i] = 0, vis[i] = false;
dis[s] = INF, vis[s] = true;
queue<int> q; q.push(s);
while (!q.empty()) {
int u = q.front(); q.pop();
vis[u] = false;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i].first, val = G[u][i].second;
int temp = min(dis[u], val);
if (dis[v] < temp) {
dis[v] = temp;
if (!vis[v]) vis[v] = true, q.push(v);
}
}
}
}
int main() {
scanf("%d", &T);
for (int kase = 1; kase <= T; kase++) {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) G[i].clear();
while (m--) {
int u, v, val; scanf("%d %d %d", &u, &v, &val);
G[u].push_back(make_pair(v, val));
G[v].push_back(make_pair(u, val));
}
spfa(1);
printf("Scenario #%d:\n%d\n\n", kase, dis[n]);
}
return 0;
}