【题目链接】
http://poj.org/problem?id=1797
题目意思
你要把货物从1号街口运到n号街口,但是每条街道都有载重上限,问你货物最重可以选多少。
解题思路
和poj2253很像的一题,poj2253是找能到n的全部路线中找一条路线,每条路线任意两点最大值为路线的权。找到最小的一个权。而这条是任意两个的最小值为权,找最大的一个权。(有点绕看看测试样例应该明白的。注意这题最后没有空行而2253有。
代码部分
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <string>
#include <map>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3
const int N = 1005;
int dis[N]; ///存储最短路
int vis[N]; ///记录是否在队列
int k,n;
struct node
{
int v,w;
}s;
vector<node>m[N];
void init()
{
for (int i = 0;i <= n; i++)
{
dis[i] = 0;
vis[i] = 0;
m[i].clear();
}
}
void spfa()
{
queue<int>q;
q.push(1);
vis[1] = 1;
dis[1] = inf;
while (!q.empty())
{
int t = q.front();
q.pop();
for (int i = 0; i < m[t].size();i++)
{
if (dis[m[t][i].v] < min(dis[t],m[t][i].w)) ///松弛
{
dis[m[t][i].v] = min(dis[t],m[t][i].w);
if (!vis[m[t][i].v]) ///判断是否在队列
{
q.push(m[t][i].v);
vis[m[t][i].v] = 1;
}
}
}
vis[t] = 0;
}
}
int main()
{
int t,cas=1;
scanf("%d",&t);
while (t--)
{
scanf("%d %d",&n,&k);
init();
for(int i =0; i < k;i++)
{
int v,u,w;
scanf("%d %d %d",&v,&u,&w);
s.v = v;
s.w = w;
m[u].push_back(s); ///双向加入邻接表
s.v = u;
m[v].push_back(s);
}
spfa();
printf("Scenario #%d:\n",cas++);
printf("%d\n",dis[n]);
if (t!=0)
printf("\n");
}
return 0;
}