http://poj.org/problem?id=1797
题意 :给出N个城市M条边,每条边都有容量值,求一条运输路线使城市1到N的运输量最大。
思路 :用dijkstra对松弛条件进行变形。解释一下样例吧:从1运到3有两种方案
方案1:1-2-3,其中1-2承重为3,2-3承重为5,则可以运送货物的最大重量是3(当大于3时明显1到不了2)
方案2:1-3,可知1-3承重为4,故此路可运送货物的最大重量是4,故答案输出4
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int a[1005][1005],n,m,dp[1005] ; bool map[1005] ; void dijk(int t) { memset(map,0,sizeof(map[0])*(n+3)) ; for(int i = 1 ; i <= n ; i++) { dp[i] = a[t][i] ; } dp[t] = 1000000 ; map[t] = true ; for(int i = 1 ; i < n ; i++) { int k = t ,temp = 0 ; for(int j = 1 ; j <= n ; j++) { if(map[j]) continue ; if(temp <= dp[j]) { temp = dp[k = j] ; } } map[k] = true ; if(map[n]) return ; for(int j = 1 ; j <= n ; j++) { if(map[j]) continue ; dp[j] = max(dp[j],min(dp[k],a[k][j])) ; } } } int main() { int T ,c = 1 ; scanf("%d",&T) ; while(T--) { scanf("%d %d",&n,&m) ; for(int i = 1 ; i <= n ; i++) { memset(a[i],0,sizeof(a[i][0])*(n+3)) ; } for(int i = 0 ; i < m ; i++) { int u,v,w ; scanf("%d %d %d",&u,&v,&w) ; a[u][v] = a[v][u] = max(a[u][v],w) ; } dijk(1) ; printf("Scenario #%d:\n",c++) ; printf("%d\n\n",dp[n]) ; } return 0; }