uva10803
题目链接请戳 这里
解题思路
直接用floyd就行了。再求最大值。
代码
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> #define N 1040 #define INF 1e9 using namespace std; int x[N], y[N]; double d[N][N], ans; int n; double get_len(int a, int b) { return sqrt(pow(x[a] - x[b], 2) + pow(y[a] - y[b], 2)); } void floyd() { 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] < INF && d[k][j] < INF) d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } bool get_ans() { ans = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (i != j) ans = max(ans, d[i][j]); if (ans == INF) return false; else return true; } int main() { int tests = 0, t, c; scanf("%d", &c); while (c--) { tests++; scanf("%d", &n); for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) d[i][j] = (i == j) ? 0 : INF; 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++) if (get_len(i, j) > 10.0) d[i][j] = d[j][i] = INF; else d[i][j] = d[j][i] = get_len(i, j); floyd(); printf("Case #%d:\n", tests); if (get_ans()) printf("%.4lf\n", ans); else printf("Send Kurdy\n"); printf("\n"); } return 0; }