将Floyd算法中求每对顶点间的最小距离,条件换成每对顶点间最长序列的最大跳数,所以要多加进去k。 #include <iostream> #include <cstdio> #include <cmath> #include <iomanip> using namespace std; class coordinate { public: double x, y; } points[201]; double path[201][201]; int main() { //freopen("temp.txt", "r", stdin); int n; int cnt = 1; while (cin >> n) { if (n == 0) break; for (int i = 1; i <= n; ++i) cin >> points[i].x >> points[i].y; for (int i = 1; i <= n-1; ++i) { for (int j = i+1; j <= n; ++j) { double x = points[i].x - points[j].x; double y = points[i].y - points[j].y; path[i][j] = path[j][i] = sqrt(x*x + y*y); //双向性 } } // Floyd-Wallshall // 这里将原本的求两点间最短路径,变为求两点间路径的最大跳数 for (int k = 1; k <= n; ++k) { for (int i = 1; i <= n-1; ++i) { for (int j = i+1; j <= n; ++j) { if (path[i][k] < path[i][j] && path[k][j] < path[i][j]) { if (path[i][k] < path[k][j]) { path[i][j] = path[j][i] = path[k][j]; //不要忘了双向性 } else { path[i][j] = path[j][i] = path[i][k]; } } } } } cout << "Scenario #" << cnt++ << endl; cout << "Frog Distance = " << fixed << setprecision(3) << path[1][2] << endl << endl; } return 0; }