Algorithm 输出精确边缘的全局最小切割算法

Algorithm 输出精确边缘的全局最小切割算法,algorithm,graph,Algorithm,Graph,我正在寻找一个算法,以找到一个无向图中的全局最小割。 我想输入一个图,并通过切割算法输出最小边数。给定的图可以分成两部分 以下是要求: 找到准确的边,而不仅仅是它们的数量 最小切割边应100%正确计算 这是一个无向图 算法应通过指示其找到答案或未找到答案来终止 我在网上搜索了一些文章,发现Karger的最小割算法是随机的,它的输出可能不是精确的最小割。我不喜欢那样。 我想计算出精确的边(我需要知道它们是哪些边),它们的数目是最小的 我希望听到一些建议,而我正在寻找这样的算法。 如果您的建议附带算

我正在寻找一个算法,以找到一个无向图中的全局最小割。 我想输入一个图,并通过切割算法输出最小边数。给定的图可以分成两部分

以下是要求:

  • 找到准确的边,而不仅仅是它们的数量

  • 最小切割边应100%正确计算

  • 这是一个无向图

  • 算法应通过指示其找到答案或未找到答案来终止

  • 我在网上搜索了一些文章,发现Karger的最小割算法是随机的,它的输出可能不是精确的最小割。我不喜欢那样。 我想计算出精确的边(我需要知道它们是哪些边),它们的数目是最小的

    我希望听到一些建议,而我正在寻找这样的算法。 如果您的建议附带算法介绍和示例代码,那就太好了


    提前感谢。

    我们可以使用最大流算法来实现这一点,当我们计算图形的最大流时,算法完成时饱和的边是最小割的一部分。你可以阅读更多关于这本书的内容。计算最大流量是一个相当标准的问题,有许多多项式时间的解决方案可用于该问题,您可以阅读更多关于它们的信息

    因此,为了总结算法,我们首先找到图的最大流,然后最小割中的边是边上的流等于该边的容量的边(那些已经饱和的边)

    因此,解决最大流问题的方法之一是使用,它在图中找到增广路径,然后使用增广路径中的最小边尝试饱和该增广路径,它重复这个过程,直到没有增广路径

    为了找到增广路径,我们可以进行深度优先搜索或广度优先搜索。Edmonds-Karp算法通过使用简单的广度优先搜索来找到一条增广路径

    < P>我编写了下面的C++代码来寻找Max流和min Cube,找到Max流的代码取自Steven Halim的“竞争编程”。 还请注意,由于图形是无向的,因此最小切割功能打印的所有边都是打印
    a--b
    b--a
    的两倍

    #include<iostream>
    #include<vector>
    #include<queue>
    #include<utility>
    
    #define MAXX 100
    #define INF 1e9
    
    using namespace std;
    
    int s, t, flow, n, dist[MAXX], par[MAXX], AdjMat[MAXX][MAXX];  //Adjacency Matrix graph
    vector< pair<int, int> > G[MAXX];   //adjacency list graph
    
    void minCut(){
        for(int i = 0;i < n;i++){
            for(int j = 0;j < G[i].size();j++){
                int v = G[i][j].first;
                if(AdjMat[i][v] == 0){  //saturated edges
                    cout << i << " " << v << endl;
                }
            }
        }
    }
    
    void augmentPath(int v, int minEdge){
        if(v == s){ flow = minEdge;return; }
        else if(par[v] != -1){
            augmentPath(par[v], min(minEdge, AdjMat[par[v]][v]));
            AdjMat[par[v]][v] -= flow;  //forward edges
            AdjMat[v][par[v]] += flow;  //backward edges
        }
    }
    
    void EdmondsKarp(){
        int max_flow = 0;
        for(int i= 0;i < n;i++) dist[i] = -1, par[i] = -1;
        while(1){
            flow = 0;
            queue<int> q;
            q.push(s);dist[s] = 0;
            while(!q.empty()){
                int u = q.front();q.pop();
                if(u == t) break;
                for(int i = 0;i < G[u].size();i++){
                    int v = G[u][i].first;
                    if(AdjMat[u][v] > 0 && dist[v] == -1){
                        dist[v] = dist[u] + 1;
                        q.push(v);
                        par[v] = u;
                    }
                }
            }
            augmentPath(t, INF);
            if(flow == 0) break;    //Max flow reached, now we have saturated edges that form the min cut
            max_flow += flow;
        }
    }
    
    int main(){
        //Create the graph here, both as an adjacency list and adjacency matrix
        //also mark the source i.e "s" and sink "t", before calling max flow.
    
        return 0;
    }
    
    #包括
    #包括
    #包括
    #包括
    #定义MAXX 100
    #定义INF 1e9
    使用名称空间std;
    int s,t,flow,n,dist[MAXX],par[MAXX],AdjMat[MAXX][MAXX]//邻接矩阵图
    向量G[MAXX]//邻接表图
    void minCut(){
    对于(int i=0;i