POJ2253最短路变形

编译器选择C++才能过,题意是:求从石头1到石头2每条通路中最长边的最小值,使用变形的floyd做法很容易解决

初始化每条边时注意是无向图还是有向图(dis[i][j]==dis[j][i]??) ,代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=210;
const int inf=0x3f3f3f;
double dis[maxn][maxn];
double x[maxn],y[maxn];
int n;
void init()
{
    for(int i=1; i<=n; i++)
    {
        cin>>x[i]>>y[i];
    }
    ///memset(dis,inf,sizeof(dis));
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            dis[j][i]=dis[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
void floyd()
{
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)//每次取i到j的通路中最大权边的最小值
                if(dis[i][j]>max(dis[i][k],dis[k][j]))
                    dis[i][j]=max(dis[i][k],dis[k][j]);
                ///dis[i][j]=min(dis[i][j],max(dis[i][k],dis[k][j]));
}//最终dis[i][j]表示的是从i到j中每一条通路中距离最大的边比较后的最小值
int main()
{
    int t=1;
    while(scanf("%d",&n)&&n)
    {
        init();
        floyd();
        printf("Scenario #%d\n",t);
        printf("Frog Distance = %.3lf\n\n",dis[1][2]);
        t++;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41658955/article/details/81487218