题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1744
题意:给出一堆坐标,然后如果两个坐标之间距离大于10就看做无穷远,否则可以连通,如果最后是一个连通图,就输出连通路线的最大值(保留小数点后四位),否则输出Send Kurdy, Floyd算法适用。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 110;
const int INF = 0x3f3f3f3f;
int x[N], y[N], n;
double g[N][N], ans;
void floyd(){
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
ans = max(ans, g[i][j]);
}
int main(){
int cases, num = 1;
scanf("%d", &cases);
while (cases--){
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d%d", &x[i], &y[i]);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++){
double tmp = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
if (tmp > 10.0)
g[i][j] = INF;
else
g[i][j] = tmp;
}
floyd();
printf("Case #%d:\n", num++);
if (ans == INF)
printf("Send Kurdy\n");
else
printf("%.4lf\n", ans);
printf("\n");
}
return 0;
}