poj 1797 最大最小容量dijkstra (经典)

Posted 00isok

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1797 最大最小容量dijkstra (经典)相关的知识,希望对你有一定的参考价值。

<题目链接>

题目大意:

Hugo Heavy要从城市1到城市N运送货物,有M条道路,每条道路都有它的最大载重量,问从城市1到城市N运送最多的重量是多少。

解题分析:

感觉这道题用dijkstra不是很好想,有点抽象。我反而觉得这道题用最大流比较好想,比如EK算法,用BFS求出所有1->n的增广路径,然后求出每条增广路径的最小值,就可最终得到这些最小值中的最大值。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define MAXV 1010 
#define INF 0x3f3f3f3f
int map[MAXV][MAXV],n,m;
 
int dijkstra(){
    int vis[MAXV],d[MAXV],i,j,v;

    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++){           //注意这个初始化     
        d[i]=map[1][i];`
    }
    int cur=1;
    for(int i=1;i<=n;i++){
        vis[cur]=1;
        for(int j=1;j<=n;j++){
            if(!vis[j]&&d[j]<min(d[cur],map[cur][j])){   //仔细揣摩这里,本题的关键
                d[j]=min(d[cur],map[cur][j]);
            }
        }

        int cal=-INF,loc=-1;
        for(int j=1;j<=n;j++){
            if(!vis[j]&&d[j]>cal){
                loc=j;
                cal=d[j];
            }
        }
        cur=loc;
    }

    return d[n];
}
 
int main(){
    int t,i,j,kcase,a,b,c;
    scanf("%d",&kcase);
    for(t=1;t<=kcase;t++)
    {
        scanf("%d %d",&n,&m);
        memset(map,0,sizeof(map));

        for(i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            map[a][b]=map[b][a]=c;
        }
        printf("Scenario #%d:
",t);
        printf("%d

",dijkstra());
    }
    return 0;
}

 

 

2018-08-15

以上是关于poj 1797 最大最小容量dijkstra (经典)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1797 Heavy Transportation (Dijkstra)

POJ 1797 Heavy Transportation

POJ1797:Heavy Transportation(改造Dijkstra)

POJ 1797 Heavy Transportation(Dijkstra运用)

POJ1797 Heavy Transportation (堆优化的Dijkstra变形)

最短路/最大生成树POJ 1797 Heavy Transportation