题目的意思就是给出几个点.
要使任意两个点联通,直接相连的两个点距离不能超过10,超过10直接忽略,
问距离最远的两个点相距多少.如果存在不联通的两个点,直接输出不行.
这样就是算出任意两个点的距离.然后遍历找最大值.
AC代码:
#include<stdio.h>
#include<cmath>
const int N = 105;
const double INF = 10000000000.0;
struct point {
double x;
double y;
}p[N];
double g[N][N];
int n;
double cul(int i , int j) {
return sqrt((p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y) );
}
int main () {
int t;
int cas = 1;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for (int i = 0 ;i < n ;i++) {
scanf("%lf%lf",&p[i].x,&p[i].y);
}
for (int i = 0 ; i < n ;i++) {
for (int j = 0 ; j < n ;j++) {
g[i][j] = cul(i,j);
if (g[i][j] > 10.0)
g[i][j] = INF;
}
}
for (int k = 0 ; k < n ;k++) {
for (int i = 0 ; i < n ;i++) {
for (int j = 0 ; j < n ;j++) {
if (g[i][k] + g[k][j] < g[i][j])
g[i][j] = g[i][k] + g[k][j];
}
}
}
double res = 0 ;
for (int i = 0 ; i < n ;i++) {
for (int j = 0 ; j < n ;j++) {
if (g[i][j] > res) {
res = g[i][j];
}
}
}
printf("Case #%d:\n",cas++);
if (res < INF)
printf("%.4lf\n",res);
else
printf("Send Kurdy\n");
printf("\n");
}
}