【题解】P6175 无向图的最小环问题

假设最终的路径是u->a->b->z->v->u,(当然也可能是b->z->v->u->a
可以发现它是由<u,v>之间的边u>和二者之间的最短路(u->a->b->z->v)连接得到的,
还要注意的是这条最短路必须包含3个即以上的点,
那么不如换个模型理解,说它是由确定的两条边a>,b>和(b,v)之间的最短路组成的,需要保证的是这三者互不相等,
其余的最短路就正常跑。
现在来看一下为什么代码不是这样的的:

	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]);
		}

	}

为什么呢?不知道为什么啊!我好废啊!不会!放!
反正就是要一边更新最短路一边找答案,记住好了。

posted @ 2021-05-28 17:44  咕咕坤  阅读(52)  评论(0编辑  收藏  举报