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

#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;
}
View Code

 

posted on 2013-12-04 21:51  枫、  阅读(259)  评论(0编辑  收藏  举报