diff --git a/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp b/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp index 1610d2c..9e501a0 100644 --- a/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp +++ b/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp @@ -1,10 +1,9 @@ #include using namespace std; const int N = 110; -#define INF 0x7ffffff +#define INF 0x3f3f3f3f /** 分析:模板题,理解floyd 的在 i , j 路径中没有包含k(因为此时k未用来更新),即可写出最小环 -在INF这里wa了两发,习惯值 1e9 不是最大值(查找时判断一下可以避免,但。。。懒了) */ int n, m; int g[N][N]; @@ -17,17 +16,17 @@ void floyd() { for (int k = 1; k <= n; k++) { // dp for (int i = 1; i < k; i++) { - for (int j = i + 1; j < k; j++) { // i,j,k序号由小到大 - if (res > dis[i][j] + g[i][k] + g[k][j]) { + for (int j = i + 1; j < k; j++) { // i,j,k序号由小到大 + if (res - dis[i][j] > g[i][k] + g[k][j]) { // 减法防溢出 res = dis[i][j] + g[i][k] + g[k][j]; - int x = j, y = i; - cnt = 0; + int x = i, y = j; + cnt = 0; // 以前有过的路径也清空 while (x != y) { - ans[cnt++] = x; - x = path[i][x]; + ans[cnt++] = y; + y = path[i][y]; } - ans[cnt++] = y; + ans[cnt++] = x; ans[cnt++] = k; // 序号最大的节点k } }