大概的思路是線封死一條邊i -> j,再找i到j的最短路dis[i][j]。dis[i][j] + w[i][j]就是一個環。找到所有環里的最小值就能得到最小環。
不過。。。用dijkstra算單源最短路的話,這個的時間雜度是O(n^4);所以可以用floyd將時間復雜度控制在O(n^3)上。
思路是在floyd算法進行松弛的時候就找這個最小環。
ans = min(ans, dis[i][j] + w[i][k] + w[k][j]); 這樣 k -> i - >.... -> j -> k就得到了一個最小環。
具體實現如下:
void dfs(int i, int j) { int k = f[i][j]; if(k == 0) { pash[num++] = j; return ; } dfs(i, k); dfs(k, j); } //--------------------------------------------------- for(k = 1; k <= n; ++k) { for(i = 1; i < k; ++i) { for(j = i + 1; j < k; ++j) { if(ans > dis[i][j] + mp[i][k] + mp[k][j]) { //找最小環 ans = dis[i][j] + mp[i][k] + mp[k][j]; num = 0; pash[num++] = i; dfs(i, j); pash[num++] = k; } } } for(i = 1; i <= n; ++i) { for(j = 1; j <= n; ++j) { if(dis[i][j] > dis[i][k] + dis[k][j]) { dis[i][j] = dis[i][k] + dis[k][j]; f[i][j] = k; //f[i][j]記錄i到j經過的點 } } } }