poj 1797(最小值里面求最大值 Dijkstra)

Heavy Transportation

  POJ - 1797 
其实这道题和poj2253正好相反,那是求所有路径中最大值边权值中的最小值,而这道题是求最小值里面的最大值,比如

1-(5)-4-(3)-5从1好点到4号点的权值是5,4号点到5号点的权值是3

1-(4)-3-(6)-5,意思同上

那么从1到5的答案应当是4

下面是Dijkstra算法的实现:

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<iomanip>
#include<queue>
using namespace std;
#define rep(i,a,b)   for(int i=a;i<=b;i++)
int e[1005][1005];
int n,m;
bool book[1005];
int dis[1005];
int MAX=0x3f3f3f3f;

int Dijkstra()
{
    rep(i,1,n)
    dis[i]=e[1][i];
    book[1]=1;
    rep(i,1,n-1)//这里要注意是1到n-1次到循环,因为n次是没有必要的,只是会浪费时间而已,所有的book都已经是走过的点,如果循环到n就TLE
    {
        int MIN=-MAX;//同样做无穷大的处理
        int u;
        rep(j,1,n)
        if(!book[j]&&dis[j]>MIN)
            MIN=dis[u=j];
            book[u]=1;
            rep(k,1,n)
            {
                if(!book[k])//其实这句话是可以不加,因为在你对dis[u]循环对其他边松弛的时候,就进行完一次就好了
                dis[k]=max(dis[k],min(dis[u],e[u][k]));
            }
    }
    return dis[n];
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t=0;
    cin>>t;
    int T=1;
    while(t--)
    {
        memset(e,-MAX,sizeof(e));//因为这道题目是让你求最大值,所以初始情况要从负无穷开始,当然,你也可以全部初始化为-1
        memset(book,0,sizeof(book));
        memset(dis,0,sizeof(dis));
        cin>>n>>m;
        rep(i,1,m)
        {
            int x,y,v;
            cin>>x>>y>>v;
            e[x][y]=e[y][x]=v;
        }
        rep(i,1,n)
        e[i][i]=0;
        cout<<"Scenario #"<<T++<<":"<<endl;//没看清格式,在这浪费了很多时间>==<
        cout<<Dijkstra()<<endl;
        cout<<endl;//这里也要注意一下,题目要求要加一行
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/c___c18/article/details/81013669