Floyd-Warshall实现APSP在n≥4时出错,求排查(UVA-13211)
UVA-13211 (Geonosis) 全源最短路径实现错误,n≥4时结果异常
我在做VJudge上的UVA-13211(Geonosis)题目,题目要求按指定顺序移除节点,每次移除节点前,累加所有未移除节点的有序点对最短路径之和。
我先用Floyd-Warshall算法实现全源最短路径(APSP),测试发现节点数n<4时结果正确,但n≥4时输出完全错误。之后尝试改用Dantzig算法,结果依然出错,实在定位不到问题,附上代码求帮忙排查。
#include <iostream> #include <vector> #include <climits> using namespace std; const int MAXN = 105; long long dist[MAXN][MAXN]; bool removed[MAXN]; int main() { int n, m; cin >> n >> m; // 初始化距离矩阵 for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { dist[i][j] = (i == j) ? 0 : LLONG_MAX; } removed[i] = false; } // 读入边 for (int i = 0; i < m; ++i) { int u, v; long long w; cin >> u >> v >> w; if (w < dist[u][v]) { dist[u][v] = w; dist[v][u] = w; } } // Floyd-Warshall计算全源最短路径 for (int k = 1; k <= n; ++k) { for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { if (dist[i][k] != LLONG_MAX && dist[k][j] != LLONG_MAX) { if (dist[i][j] > dist[i][k] + dist[k][j]) { dist[i][j] = dist[i][k] + dist[k][j]; } } } } } // 读入移除顺序 vector<int> order(n); for (int i = 0; i < n; ++i) { cin >> order[i]; } long long total = 0; vector<long long> results; // 按顺序移除节点,每次移除前计算当前未移除节点的有序点对路径和 for (int idx = 0; idx < n; ++idx) { int u = order[idx]; // 计算当前未移除节点的路径和 long long sum = 0; for (int i = 1; i <= n; ++i) { if (removed[i]) continue; for (int j = 1; j <= n; ++j) { if (removed[j]) continue; if (dist[i][j] != LLONG_MAX) { sum += dist[i][j]; } } } results.push_back(sum); removed[u] = true; } // 输出结果 for (long long s : results) { cout << s << endl; } return 0; }
内容的提问来源于stack exchange,提问作者str8
相关产品推荐
相关产品推荐

