UVA_10803
在建图的时候需要过滤掉长度大于10的边,然后用floyd求任意两点间的最短路,然后找到最短路中的最大值即可。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAXD 110
#define INF 1000000000
int N;
double f[MAXD][MAXD], x[MAXD], y[MAXD];
double sqr(double x)
{
return x * x;
}
void init()
{
int i, j;
scanf("%d", &N);
for(i = 0; i < N; i ++)
scanf("%lf%lf", &x[i], &y[i]);
for(i = 0; i < N; i ++)
for(j = 0; j < N; j ++)
{
if(i == j)
f[i][j] = 0;
else
{
f[i][j]= sqrt(sqr(x[i] - x[j]) + sqr(y[i] - y[j]));
if(f[i][j] > 10.0)
f[i][j] = INF;
}
}
}
void floyd()
{
int i, j, k;
double ans;
for(k = 0; k < N; k ++)
for(i = 0; i < N; i ++)
for(j = 0; j < N; j ++)
if(f[i][k] + f[k][j] < f[i][j])
f[i][j] = f[i][k] + f[k][j];
ans = 0;
for(i = 0; i < N; i ++)
for(j = 0; j < N; j ++)
if(f[i][j] > ans)
ans = f[i][j];
if(fabs(ans - INF) < 1)
printf("Send Kurdy\n");
else
printf("%.4f\n", ans);
}
int main()
{
int t, tt;
scanf("%d", &t);
for(tt = 0; tt < t; tt ++)
{
init();
printf("Case #%d:\n", tt + 1);
floyd();
printf("\n");
}
return 0;
}