POJ 1797 Heavy Transportation(Dijkstra)

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

 

你可能感兴趣的:(dijkstra)