Uva(10048),最短路Floyd

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=989

紫书P365页

题意:求最大值的最小值。

莫名其妙的WA,原来是INF的值太大,还是刘汝佳说的好,INF太大d[i][k]+d[k][j],就容易溢出,稍微大一点就好,就是总长。

然后就是重边的问题了,题目死活没找到有说到重边的问题。还好经验告诉我,有重边。

然后就是PE,还是很隐蔽。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define MAXN 105
#define INF 1000000000

int dist[MAXN][MAXN];

int main()
{
    int n,m,q;
    int cases = 0;
    while(scanf("%d%d%d",&n,&m,&q)==3&&n)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dist[i][j] = INF;

        for(int i=1;i<=n;i++)
            dist[i][i] = 0;

        for(int i=0;i<m;i++)
        {
            int u,v,d;
            scanf("%d%d%d",&u,&v,&d);
            dist[u][v] = dist[v][u] = min(dist[u][v],d);
        }

        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    dist[i][j] = min(dist[i][j],max(dist[i][k],dist[k][j]));
        if(cases) puts("");
        printf("Case #%d
",++cases);
        for(int i=0;i<q;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            if(dist[u][v]>=INF)
                puts("no path");
            else printf("%d
",dist[u][v]);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5788356.html