POJ1797---Heavy Transportation(最短路变形)

来源:互联网 发布:程序员真的每天很累吗 编辑:程序博客网 时间:2024/05/17 22:52

题目来源:https://vjudge.net/problem/POJ-1797
【题意】
从点1到点n,很多条路径,每条路径都有一个最小的权值,求这些最小的权值里的最大值。
【思路】
这道题和我做的的上一题差不多一样的做法(自行点击)。均是维护d数组就可以了,只不过稍微有些变化而已,做这种题的关键是理解。
【代码】

#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define INF 0x3f3f3f3fusing namespace std;int w[1010][1010];int d[1010];bool vis[1010];int n,m;void djs(){    for(int i=1; i<=n; i++)    {        d[i]=w[1][i];        vis[i]=0;    }    for(int i=1; i<=n; i++)    {        int m=-1;        int x=-1;        for(int j=1; j<=n; j++)            if(!vis[j]&&d[j]>m)                m=d[x=j];        if(x!=-1)        {            vis[x]=1;            for(int j=1; j<=n; j++)                if(!vis[j]&&d[j]<min(d[x],w[x][j]))                    d[j]=min(d[x],w[x][j]);//维护d数组        }    }}int main(){    int T,t=1;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        for(int i=1; i<=n; i++)            for(int j=1; j<=n; j++)                w[i][j]=i==j?0:-1;        for(int i=1; i<=m; i++)        {            int x,y,z;            scanf("%d%d%d",&x,&y,&z);            if(w[x][y]<z)                w[x][y]=w[y][x]=z;        }        djs();        printf("Scenario #%d:\n%d\n\n",t++,d[n]);    }}
原创粉丝点击