Description
Input
Output
Sample Input
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output
Scenario #1: 4
大意:
Hugo Heavy要从城市1到城市N运送货物,有M条道路,每条道路都有它的最大载重量,问从城市1到城市N运送最多的重量是多少。
思路:
这道题我们可以采用类似于求最短路径的方法,用一种新的“松弛操作”去取代原本的方法。 我们可以记录d[u]为运送货物到点j时最大可载重量。那么对于一条边(x,y),我们有d[y]=max(d[y],min(d[x],v(x,y))).
#include<queue> #include<cstdio> #include<iostream> #define MAXN 1010 using namespace std; int n,m,t,tot,map[MAXN][MAXN],dis[MAXN]; bool b[MAXN]; queue<int> q; inline void read(int&x) { x=0;int f=1;char c=getchar(); while(c>‘9‘||c<‘0‘) {if(c==‘-‘) f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘) {x=(x<<1)+(x<<3)+c-48;c=getchar();} x=x*f; } inline void spfa() { for(int i=1;i<=n;i++) {dis[i]=0;b[i]=0;} q.push(1); b[1]=true; while(!q.empty()) { int u=q.front(); q.pop(); b[u]=false; for(int i=1;i<=n;i++) { if(u==1&&map[u][i]) { dis[i]=map[u][i]; q.push(i); b[i]=true; continue; } if(dis[i]<min(dis[u],map[u][i])) { dis[i]=min(dis[u],map[u][i]); if(!b[i]) { q.push(i); b[i]=true; } } } } printf("%d\n\n",dis[n]); return; } int main() { int a,b,c,cnt=0; read(t); while(t--) { cnt++; read(n);read(m); for(int i=1;i<=m;i++) { read(a);read(b);read(c); map[a][b]=map[b][a]=c; } printf("Scenario #%d:\n",cnt); spfa(); for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) map[i][j]=0; } return 0; }
原文:http://www.cnblogs.com/whistle13326/p/6368428.html