洛谷 P6175 無向圖的最小環問題

題目傳送門

Floyd,每當處理到一個斷點k時,更新答案,用此時的所有任選兩個點(除了k外)的最短路和到k的距離更新答案,因爲此時的最短路一定不包括k,可以滿足環的要求.

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

long long n,m,g[101][101],dp[101][101],ans = 2099999999;

int main() {
	scanf("%lld%lld",&n,&m);
	memset(g,0xf,sizeof(g));
	memset(dp,0xf,sizeof(dp));
	for(int i = 1;i <= m; i++) {
		long long x,y,z;
		scanf("%lld%lld%lld",&x,&y,&z);
		dp[x][y] = dp[y][x] = g[x][y] = g[y][x] = min(z,g[y][x]);
	}
	for(int k = 1;k <= n; k++) {
		for(int i = 1;i < k; i++)//爲什麼到k-1就可以了呢?因爲在以後的更新中一定會用到k~n的情況 
			for(int j = i + 1;j < k; j++)
				if(i != j && j != k && i != k)
					ans = min(ans,g[i][k] + g[k][j] + dp[i][j]);
		for(int i = 1;i <= n; i++)
			for(int j = 1;j <= n; j++)
				if(i != j && j != k && i != k)
					dp[j][i] = dp[i][j] = min(dp[i][j],dp[i][k] + dp[k][j]);
	}
	if(ans < 1000000000)
		printf("%lld",ans);
	else printf("No solution.");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章