题目的意思其实是说给一个无向图..并给出两点间的路径..以及路径所能承受的最大重量..问从点1出发..最多能带多重的货物到达点n..使得经过的路径都不会超过最大承受重量..
就是将求最短路径时..原本每次是更新起点到某点的最短距离,改为起点到某点的最大承重..dijkstra..Bellman-Ford...SPFA都可以...
我就因为写错一个变量..结果不停的RE..搞得很郁闷..一度怀疑题意理解有问题...耽误了好多时间反复检查..总之还是不够细心...
#include<iostream>
#include<queue>
#include<stdio.h>
#include<math.h>
#define oo 200000000
using namespace std;
int T,t,n,m,_link[1005];
struct node
{
int x,y,w,next;
}line[2000005];
queue<int> myqueue;
int s[1005];
bool inqueue[1005];
int SPFA()
{
int i,k,h,x;
for (i=1;i<=n;i++)
{
s[i]=0;
inqueue[i]=false;
}
while (!myqueue.empty()) myqueue.pop();
s[1]=oo;
myqueue.push(1);
while (!myqueue.empty())
{
h=myqueue.front();
myqueue.pop();
inqueue[h]=false;
k=_link[h];
while (k)
{
x=min(s[h],line[k].w);
if (s[line[k].y]<x)
{
s[line[k].y]=x;
if (!inqueue[line[k].y])
{
myqueue.push(line[k].y);
inqueue[line[k].y]=true;
}
}
k=line[k].next;
}
}
return s[n];
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&T);
t=0;
while (T--)
{
int x,y,z,i;
scanf("%d%d",&n,&m);
for (x=1;x<=n;x++) _link[x]=0;
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
line[i*2-1].x=x; line[i*2-1].y=y; line[i*2-1].w=z;
line[i*2-1].next=_link[x]; _link[x]=i*2-1;
line[i*2].x=y; line[i*2].y=x; line[i*2].w=z;
line[i*2].next=_link[y]; _link[y]=i*2;
}
m*=2;
printf("Scenario #%d:\n%d\n\n",++t,SPFA());
}
return 0;
}