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
原文地址:https://www.cnblogs.com/qwertiLH/p/7725513.html