洛谷 P6175 無向圖的最小環問題
阿新 • • 發佈:2020-10-23
題目傳送門
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; }