zoukankan      html  css  js  c++  java
  • kuangbin专题四 C Heavy Transportation

    kuangbin 专题四 最短路练习
    POJ 1797 题 
    C - Heavy Transportation 

    题目链接:http://poj.org/problem?id=1797

    题意:n 个 点 m 个通道 , 从 1 -> n 最少存在一条不同的路径 , 计算 从 1 -> n 所有路径上 权值最小的那条边 权值最大为多少

    思路: 最多存在 1000 个点 (肯定不用floyd算法)

       可以有 dijksual 算法 改编一下得到目标算法 。

       添加新点时 每次添加和 权值最大的边点 , 

        用最大的最小权值 维护 新的 从 1 ->未添加点的 距离(直接或者间接)

    AC代码:

    /*题目大意是就是何处一个图,n个顶点和m条边,每个边都有最大承载量,现在我要从1点运送货物到n点,求能运送货物的最大重量。
    对于数据,第一行为t代表测试数据个数,第二行为n和m(意义见上),接着m行,每行三个整数分别是代表一条边的起点,
    终点及最大承重量。输出能运送货物的最大重量,格式见样例。注意数据输完后还要再多输一个空行。
    对于数据,从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<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    
    using namespace std ; 
    
    #define len 1005
     
    int map[len][len] ; 
    int t, n , m , Case=0;
    
    int dijkstra(){
        int visit[len] = {0} ; 
        int d[len]  , v ; 
        for(int i=1 ; i<=n ; i++){ // 1号道路和 i 号道路交叉路口的承重 
            d[i] = map[1][i] ; //d[i] = 0 时代表不相邻 
        }
        for(int i =1 ; i<=n ; i++){// 探测 n 个街道 
            int f=-1 ; 
            for(int j=1; j <= n ; j++){ // 每次从n个街道里面选出承重最大的 
                if(!visit[j] && d[j] > f ){
                    f= d[j] ; 
                    v = j ;  
                }
            } 
            visit[v] = 1 ;// 将找到的从1到v最大承重标记 
            for(int j=1 ; j<=n ; j++){//从找到的路口往下探测 
                
                if(!visit[j] && d[j] < min(d[v] , map[v][j])){
                // 更新道路 v 与 道路 j 形成的路口 到道路 1 的最大承重 
                    d[j] = min(d[v] , map[v][j]) ; 
                }
            } 
        } 
        return d[n] ; 
    }
    
    int main(){
         
        scanf("%d" , &t) ; 
        while(t--){
            
            scanf("%d%d" , &n , &m) ; //   n 条街道  , m 个路口 
            memset(map , 0 , sizeof(map)) ; // 初始化所有路口承重为零 
            int a , b , c ; 
            for(int i=1 ; i<=m ; i++){ // m 个路口 
                scanf("%d%d%d" , &a, &b , &c ) ; 
                map[a][b] = map[b][a] = c ; 
            }
            printf("Scenario #%d:
    ", ++Case)  ; 
            printf("%d
    
    " , dijkstra()) ; 
        }
        return 0 ; 
    } 
  • 相关阅读:
    WPF listbox 实现动态滚轮下拉定位
    VS的安装和入门使用
    pyqt5学习之菜单栏,工具栏,状态栏
    pyqt5学习之QSpinBox
    pyqt5环境安装
    pyqt5学习之QKeySequeueEdit
    pyqt5学习之QPainTextEditer
    pyqt5学习之QTextEditer
    pyqt5学习之QABstractScrollArea
    pyqt5学习之QFrame
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7597237.html
Copyright © 2011-2022 走看看