zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    mysql"ON DUPLICATE KEY UPDATE"的用法
    shell 数组用法
    linux命令行提示符显示太长怎么办?
    热备份、温备份、冷备份(Hot/Warm/Cold Backup)
    Domain key在反垃圾邮件中的应用
    计算机的存储单位
    IIS W3C日志记录字段和HTTP状态代码的说明
    noarch
    日志传送
    Remote Desktop Issues
  • 原文地址:https://www.cnblogs.com/00isok/p/9484479.html
Copyright © 2011-2022 走看看