Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
150667 jiayou 巡逻线路 C++ 解答错误 0 0 MS 360 KB 2607 2024-06-06 15:03:31

Tests(0/5):


#include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX_N 1000 #define INF 1e18 // 定义一个无穷大的值表示不可达 typedef struct { int x; int y; } Point; double distance(Point a, Point b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); } double dp[MAX_N][MAX_N]; // DP数组用于存储最短路径 int n, b1, b2; Point points[10000]; int main() { scanf("%d%d%d", &n, &b1, &b2); for (int i = 0; i < n; i++) { scanf("%d%d", &points[i].x, &points[i].y); } // 初始化DP数组 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { dp[i][j] = INF; } } // 初始化起点A和关键点b1到自身的距离为0 dp[0][0] = 0; if (b1 != 0) dp[b1][b1] = 0; // 计算从A到B并经过b1的最短路径 for (int i = 1; i < n; i++) { // 从A到当前点i for (int j = 0; j < i; j++) { dp[i][j] = fmin(dp[i][j], dp[j][j] + distance(points[j], points[i])); } // 从b1到当前点i if (b1 != 0) { for (int j = 0; j < i; j++) { if (j != b1) { dp[i][j] = fmin(dp[i][j], dp[b1][j] + distance(points[b1], points[i])); } } } } // 类似地,我们需要从B到A并经过b2计算最短路径 // 但是,由于我们已经有了从A到B的路径,我们可以直接反转路径并计算从B到A的距离 // 这里省略了从B到A的计算,因为它可以通过反转点和距离来实现 // 假设dp[n-1][j]现在包含从A到B且可能经过b1的最短路径 // 我们需要找到从B到A且经过b2的最短路径,并减去从b1到b2的重复部分 double shortest_path = INF; for (int j = 0; j < n; j++) { if (j != b1 && j != b2) { double path_length = dp[n-1][j] + distance(points[j], points[b2]) + distance(points[b2], points[0]); // 减去从b1到b2的重复部分(如果路径包含了b1) if (dp[b1][j] != INF) { path_length -= distance(points[b1], points[b2]); } shortest_path = fmin(shortest_path, path_length); } } // 输出结果,精确到小数点后两位 printf("%.2f\n", shortest_path); return 0; }


测评信息: