diff --git a/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp b/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp index 73d4710..2691678 100644 --- a/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp +++ b/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp @@ -7,8 +7,8 @@ const int N = 110; 在INF这里wa了两发,习惯值 1e9 不是最大值(查找时判断一下可以避免,但。。。懒了) */ int n, m; -int mp[N][N]; int g[N][N]; +int dis[N][N]; int path[N][N]; int ans[N]; int cnt; @@ -16,49 +16,49 @@ int mm; void floyd() { mm = INF; for (int k = 1; k <= n; k++) { + // dp for (int i = 1; i < k; i++) { for (int j = i + 1; j < k; j++) { - int x = g[i][j] + mp[k][i] + mp[k][j]; + int x = dis[i][j] + g[k][i] + g[k][j]; if (x < mm) { mm = x; - int tmp = j; + int tg = j; cnt = 0; - while (tmp != i) { - ans[cnt++] = tmp; - tmp = path[i][tmp]; + while (tg != i) { + ans[cnt++] = tg; + tg = path[i][tg]; } ans[cnt++] = i; ans[cnt++] = k; } } } - - for (int i = 1; i <= n; i++) { - for (int j = 1; j <= n; j++) { - if (g[i][j] > g[i][k] + g[k][j]) { - g[i][j] = g[i][k] + g[k][j]; - path[i][j] = path[k][j]; + // floyd + for (int i = 1; i <= n; i++) + for (int j = 1; j <= n; j++) + if (dis[i][j] > dis[i][k] + dis[k][j]) { + dis[i][j] = dis[i][k] + dis[k][j]; + path[i][j] = path[k][j]; // 这咋还和我理解的不一样呢? } - } - } } } int main() { while (cin >> n >> m) { - for (int i = 1; i <= n; i++) { + // 邻接矩阵初始化 + for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { - g[i][j] = mp[i][j] = INF; + dis[i][j] = g[i][j] = INF; path[i][j] = i; } - } + // 读入边 while (m--) { int a, b, c; cin >> a >> b >> c; - g[a][b] = g[b][a] = min(g[a][b], c); // 防重边 - mp[a][b] = mp[b][a] = g[a][b]; + g[a][b] = g[b][a] = min(g[a][b], c); + dis[a][b] = dis[b][a] = g[a][b]; } floyd(); @@ -67,7 +67,7 @@ int main() { puts("No solution."); continue; } - for (int i = 0; i < cnt; ++i) printf("%d%s", ans[i], (i == cnt - 1) ? "\n" : " "); + for (int i = 0; i < cnt; i++) printf("%d%s", ans[i], (i == cnt - 1) ? "\n" : " "); } return 0; } \ No newline at end of file