Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 34215 | Accepted: 10985 |
Description
Input
Output
Sample Input
2 0 0 3 4 3 17 4 19 4 18 5 0
Sample Output
Scenario #1 Frog Distance = 5.000 Scenario #2 Frog Distance = 1.414
给一些点的坐标,求第一个点到第二个点的最短路长度
每条路径的长度为这条路径中相邻两点间最大的距离
注意输出用%.3f
法一:Floyd变形,141MS
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> using namespace std; const double INF = 0xfffffff; const int MAXN = 200 + 10; double X[MAXN], Y[MAXN]; double w[MAXN][MAXN]; //两点间距离 double Distance(double x1, double y1, double x2, double y2) { return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); } int main() { //freopen("in.txt", "r", stdin); int n, kase = 1; while (~scanf("%d", &n), n) { for (int i = 1; i <= n; i++) //初始化所有点之间距离为无穷大 for (int j = 1; j <= n; j++) w[i][j] = INF; for (int i = 1; i <= n; i++) { scanf("%lf%lf", &X[i], &Y[i]); //保存所有两点间距离 for (int j = 1; j < i; j++) w[i][j] = w[j][i] = Distance(X[i], Y[i], X[j], Y[j]); } for (int k = 1; k <= n; k++) //Floyd { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (w[i][k] != INF && w[k][j] != INF) { w[i][j] = min(w[i][j], max(w[i][k], w[k][j])); } } } } printf("Scenario #%d\nFrog Distance = %.3f\n\n", kase++, w[1][2]); } return 0; }
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> using namespace std; const double INF = 0xfffffff; const int MAXN = 200 + 10; double X[MAXN], Y[MAXN]; int vis[MAXN]; double w[MAXN][MAXN], d[MAXN]; double Distance(double x1, double y1, double x2, double y2) { return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); } int main() { //freopen("in.txt", "r", stdin); int n, kase = 1; while (~scanf("%d", &n), n) { for (int i = 1; i <= n; i++) //初始化 for (int j = 1; j <= n; j++) w[i][j] = (i == j ? 0 : INF); for (int i = 1; i <= n; i++) d[i] = (i == 1 ? 0 : INF); for (int i = 1; i <= n; i++) //保存距离 { scanf("%lf%lf", &X[i], &Y[i]); for (int j = 1; j < i; j++) w[i][j] = w[j][i] = Distance(X[i], Y[i], X[j], Y[j]); } memset(vis, 0, sizeof(vis)); //清除所有点的标号 for (int i = 1; i < n; i++) //循环n-1次 { double Min = INF; //在所有未标号的结点中,选出d最小的结点x int x = 1; for (int y = 1; y <= n; y++) if (!vis[y] && d[y] < Min) Min = d[x = y]; vis[x] = 1; //给x标记,对于从x出发的所有边(x,y),更新d[y] for (int y = 1; y <= n; y++) if (d[y] > max(d[x], w[x][y])) d[y] = max(d[x], w[x][y]); } printf("Scenario #%d\nFrog Distance = %.3f\n\n", kase++, d[2]); } return 0; }