無向圖、有向圖的最小環


  大概的思路是線封死一條邊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經過的點
                }
            }
        }
    }

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM