zoukankan      html  css  js  c++  java
  • 无向图、有向图的最小环

      大概的思路是线封死一条边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经过的点
                    }
                }
            }
        }
  • 相关阅读:
    读写文件流
    关闭和退出窗口
    有什么问题?
    将aspx页面转换成htm页面
    读取rss聚合文件
    运算符重载实例
    委托
    将 Visual Studio .NET 调试器用于 ASP.NET 应用程序
    输入的字符串进行有规则的清洗
    几个常用的数据库连接字符串
  • 原文地址:https://www.cnblogs.com/vongang/p/2598167.html
Copyright © 2011-2022 走看看