poj 1797 Heavy Transportation (spfa 最短路 )
给出一个图 图中每段路都有个载重量 一条路径的总载重量为奇各段路中 载重量最小的值 找从1到n的各路径中总载重量最大的
d[i] 为从起点到 点i 的路径中 总载重量最大的
只要将spfa 松弛的条件改一下 就好了
if(d[b]<min(d[a],w[a][b])
d[b]=min(d[a],w[a][b])
#include<iostream> #include<string.h> #include<queue> #include<vector> #define INF 100000000 using namespace std; vector <int > g[2002],w[2002]; int vis[2002],d[2002]; int min(int a,int b) { return a<b?a:b; } void spfa(int s,int n) { queue <int > q; memset(vis,0,sizeof(vis)); memset(d,0,sizeof(d)); q.push (1);//vis[1]=1; while(!q.empty ()) { int a,b,v; a=q.front (); q.pop (),vis[a]=0; for(int i=0;i<g[a].size ();i++) { b=g[a][i]; v=w[a][i]; if(a==1) { d[b]=v; q.push(b); vis[b]=1; } else if(min(d[a],v)>d[b]) { d[b]=min(d[a],v); if(!vis[b]) { q.push (b); vis[b]=1; } } } } } int main() { int i,n,m,t,a,b,c,p=1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); g[a].push_back (b); w[a].push_back (c); g[b].push_back (a); w[b].push_back (c); } spfa(1,n); printf("Scenario #%d:\n",p++); printf("%d\n\n",d[n]); for(int j=1;j<=n;j++) { g[j].clear (); w[j].clear (); } } return 0; }