題目:給你平面上的n個點(笛卡爾坐標),每個點之間都有連線,如果距離超過10就認為斷開;
請你給出所有點間最短距離的最大值。
分析:最短路。多源最短路使用floyd算法。
首先建圖,然後將大於10的邊都定義成oo,求解最短路,輸出最短路中的最大值即可。
說明:距離700題還有40題╮(╯▽╰)╭。
#include <cstring>
#include <cstdio>
#include <cmath>
const double oo = 50000;
typedef struct _point
{
double x,y;
}point;
point P[101];
double dist[101][101];
int main()
{
int T,n;
while (~scanf("%d",&T))
for (int t = 1; t <= T; ++ t) {
//input
scanf("%d",&n);
for (int i = 0; i < n; ++ i)
scanf("%lf%lf",&P[i].x,&P[i].y);
//initial
for (int i = 0; i < n; ++ i)
for (int j = 0; j < n; ++ j) {
dist[i][j] = 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));
if (dist[i][j] > 10.0)
dist[i][j] = oo;
}
//floyd
for (int k = 0; k < n; ++ k)
for (int i = 0; i < n; ++ i)
for (int j = 0; j < n; ++ j)
if (dist[i][j] > dist[i][k]+dist[k][j])
dist[i][j] = dist[i][k]+dist[k][j];
//find max
double Max = 0;
for (int i = 0; i < n; ++ i)
for (int j = 0; j < n; ++ j)
if (Max < dist[i][j])
Max = dist[i][j];
//output
printf("Case #%d:\n",t);
if (Max == oo)
printf("Send Kurdy\n\n");
else printf("%.4lf\n\n",Max);
}
return 0;
}