POJ 1797 Heavy Transportation

来源:互联网 发布:笑气在淘宝怎么搜 编辑:程序博客网 时间:2024/04/28 05:42

题目链接: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;}
0 0
原创粉丝点击