就是求任意两点之间最短距离的 最大值 floyd完美解决  自己一个多月没练,手生了,题目也难读懂了!努力吧骚年!

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

using std::min;
using std::max;
int n;
int dx[103][2];
double d[102][102];
double solve(int x, int y)
{
    return sqrt((dx[x][0]-dx[y][0])*(dx[x][0]-dx[y][0])+(dx[x][1]-dx[y][1])*(dx[x][1]-dx[y][1]));
}
int main()
{
    int t;
    int cas=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        memset(d, 0x7f, sizeof(d));
        for(int i=0; i<n; ++i)
        {
            scanf("%d %d",&dx[i][0],&dx[i][1]);
        }
        double ans=d[0][0];
        for(int i=0; i<n; ++i)
            for(int j=0; j<n; ++j)
            {
                double dis=solve(i,j);
                if(dis<=10.0)
                    d[i][j]=dis;
            }
        for(int k=0; k<n; ++k)
        {
            for(int i=0; i<n; ++i)
            {
                for(int j=0; j<n; ++j)
                {
                    if(d[i][k]<ans && d[k][j]<ans)
                    d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
                }
            }
        }
        double mi=0;
        bool ok=false;
        for(int i=0; i<n; ++i)
        {
            for(int j=0; j<n; ++j)
            {
                if(d[i][j]<ans)
                {
                    mi=max(mi,d[i][j]);
                }
                else ok=true;
            }
        }
        printf("Case #%d:\n",++cas);
        if(ok)
            puts("Send Kurdy");
        else
            printf("%.4lf\n",mi);
            puts("");
    }
    return 0;
}
View Code

 

posted on 2014-01-14 15:19  风流monkey  阅读(118)  评论(0编辑  收藏  举报