码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-08-16 00:45:44      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:memset   i++   链接   eof   初始   比较   \n   http   ase   

<题目链接>

题目大意:

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:\n",t);
        printf("%d\n\n",dijkstra());
    }
    return 0;
}

 

 

2018-08-15

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

标签:memset   i++   链接   eof   初始   比较   \n   http   ase   

原文地址:https://www.cnblogs.com/00isok/p/9484479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!