【题解】P6175 无向图的最小环问题
假设最终的路径是u->a->b->z->v->u,(当然也可能是b->z->v->u->a
可以发现它是由<u,v>之间的边
还要注意的是这条最短路必须包含3个即以上的点,
那么不如换个模型理解,说它是由确定的两条边
其余的最短路就正常跑。
现在来看一下为什么代码不是这样的的:
ans = Inf;
for(int k = 1; k <= n; ++k){
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= n; ++j) f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
}
for(int k = 1; k <= n; ++k){
for(int i = 1; i < k; ++i){
for(int j = i + 1; j < k; ++j){
ans = min(ans, G[i][k] + G[k][j] + f[j][i]);
}
}
}
而是这样的:
ans = Inf;
for(int k = 1; k <= n; ++k){
for(int i = 1; i <= n; ++i){
for(int j = i; j <= n; ++j){
if(i == j || i == k || k == j) continue;
ans = min(ans, G[i][k] + G[k][j] + f[j][i]);
}
}
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= n; ++j) f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
}
为什么呢?不知道为什么啊!我好废啊!不会!放!
反正就是要一边更新最短路一边找答案,记住好了。
本文来自博客园,作者:咕咕坤,转载请注明原文链接:https://www.cnblogs.com/GuguKun/p/14823293.html