题目链接:[POJ 1797]Heavy Transportation[SPFA]
题意分析:
求从点1到点n的所有路径中,路径上最小的容量的最大值。
解题思路:
将最短路的思路改改就行了。dis[i]数组记录的是从点1到点i的道路上最小的道路容量。注意初始化dis数组。
个人感受:
之所以写写是因为在初始化那里卡了下,试了几次。
具体代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int MAXN = 1e3 + 111;
struct N{
int to, cap;
N(int a, int b){
to = a; cap = b;
}
};
vector<N> G[MAXN];
int dis[MAXN];
bool in[MAXN];
void spfa(int s)
{
queue<int> q;
q.push(s);
for (int i = 0; i < G[s].size(); ++i)
{
N &e = G[s][i];
dis[e.to] = e.cap;
q.push(e.to);
in[e.to] = 1;
}
in[s] = 1;
while (q.size())
{
int cur = q.front(); q.pop(); in[cur] = 0;
for (int i = 0; i < G[cur].size(); ++i)
{
N &e = G[cur][i];
if (dis[e.to] < min(dis[cur], e.cap))
{
dis[e.to] = min(dis[cur], e.cap);
if (!in[e.to])
{
in[e.to] = 1;
q.push(e.to);
}
}
}
}
}
int main()
{
int t, n, m;
for (int kase = scanf("%d", &t); kase <= t; ++kase)
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) G[i].clear();
while (m --)
{
int u, to, w;
scanf("%d%d%d", &u, &to, &w);
G[u].push_back(N(to,w));
G[to].push_back(N(u,w));
}
memset(dis, 0, sizeof(int)*(n + 10));
memset(in, 0, sizeof(bool)*(n + 10));
spfa(1);
printf("Scenario #%d:\n%d\n\n", kase, dis[n]);
}
return 0;
}