|
|
|
@ -1,10 +1,9 @@
|
|
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|