zoukankan      html  css  js  c++  java
  • POJ 1797 Heavy Transprotation ( 最短路变形 || 最小生成树 )

    题意 : 找出 1 到 N 点的所有路径当中拥有最大承载量的一条路,输出这个最大承载量!而每一条路的最大承载量由拥有最大承载量的那一条边决定

    分析 : 与 POJ 2253 相似且求的东西正好相反,属于求从一个指定起点到终点的所有路径当中拥有最大or最小的边是什么。只要改变一下 Dijkstra 中 DP 的意义 ==> Dis[i] 表示起点到 i 点的所有路径当中拥有最大or最小的边的权值。当然也可以使用最小生成树做法,但是这里的边应该是从大排到小,其他的都和 POJ 2253 一模一样了!

    #include<bits/stdc++.h>
    using namespace std;
    const int INF  = 0x3f3f3f3f;
    const int maxn =  1010;
    
    bool vis[maxn];
    int G[maxn][maxn],dis[maxn];
    int n, m;
    int dijkstra(int v)
    {
        int i, j, u;
        for(i=1;i<=n;i++){
            dis[i]=G[v][i];
            vis[i]=false;
        }
    
        dis[v]=0;
        vis[v]=true;
        for(i=1;i<n;i++){
            int MaxEdge = -INF;
            for(j=1;j<=n;j++){
                if(!vis[j] && MaxEdge < dis[j]){
                    MaxEdge = dis[j];
                    u = j;
                }
            } if(MaxEdge == -INF) break;
    
            vis[u]=true;
            for(j=1;j<=n;j++){
                if(!vis[j]){
                    dis[j] = max(dis[j], min(dis[u], G[u][j]));
                }
            }
        }
        return dis[n];
    }
    int main()
    {
        int nCase;
        scanf("%d", &nCase);
        for(int t=1; t<=nCase; t++){
            scanf("%d %d", &n, &m);
            for(int i=0; i<=n; i++)
                for(int j=0; j<=n; j++)
                    G[i][j] = 0;
    
            int a, b, c;
            for(int i=0; i<m; i++){
                scanf("%d %d %d", &a, &b, &c);
                G[a][b] = G[b][a] = c;
            }
            printf("Scenario #%d:
    ", t);
            printf("%d
    
    ", dijkstra(1));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    OWIN启动项的检测
    Katana概述
    update-database时出现Cannot attach the file
    数据并行
    SpinLock(自旋锁)
    屏障
    同步操作
    T4文本模板
    托管线程中的取消
    监视器
  • 原文地址:https://www.cnblogs.com/qwertiLH/p/7725513.html
Copyright © 2011-2022 走看看