POJ 1797 Heavy Transportation

题目链接:kuangbin带你飞 专题四 最短路练习 C - Heavy Transportation

题意

有n个城市,n个城市之间有m条公路或桥梁,每个公路或桥都有一个最大载重量,问从城市1到城市n所能运送到货物到最大重量是多少

思路

显然1到n的最大承重量为所有公路的承重量的最小值
那么本题就是要求1到n的所有可能路径中最大承重量最大的一条路,即所经过所有公路的载重量最小值 最大的一条路。
对dijkstra进行修改,令d[i]表示1到i的所有可能路径中载重量最小值最大的一条路的最小值,最终的解就是d[n];

代码

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>

using namespace std;

const int N = 1009;
const int MAX = 0x3f3f3f3f;
int v[N][N];
bool vis[N];
int d[N];

int dijkstra(int n)
{
    memset(vis, 0, sizeof(vis));
    for(int i=1; i<=n; i++)
        d[i] = v[1][i];
    vis[1] = 1;
    for(int i=1; i<n; i++)
    {
        int x = -1, max = 0;
        for(int j=1; j<=n; j++)
        {
            if(!vis[j] && d[j] > max)
                max = d[x = j];
        }
        if(x == -1)
            break;
        vis[x] = 1;
        for(int j=1; j<=n; j++)
        {
            if(!vis[j])
            {
                int mmin = min(max, v[j][x]);
                if(mmin > d[j])
                {
                    d[j] = mmin;
                }
            }
        }
    }
    return d[n];
}

int main()
{
    int T;
    cin>>T;
    for(int C=1; C<=T; C++)
    {
        int n, m;
        cin>>n>>m;
        memset(v, 0, sizeof(v));
        for(int i=0; i<m; i++)
        {
            int a, b, c;
            scanf("%d%d%d",&a,&b,&c);
            v[a][b] = v[b][a] = c;
        }
        cout<<"Scenario #"<<C;
        cout<<":"<<endl;
        cout<<dijkstra(n)<<endl<<endl;
    }
    return 0;
}

你可能感兴趣的:(poj)