Algorithm 输出精确边缘的全局最小切割算法
我正在寻找一个算法,以找到一个无向图中的全局最小割。 我想输入一个图,并通过切割算法输出最小边数。给定的图可以分成两部分 以下是要求:Algorithm 输出精确边缘的全局最小切割算法,algorithm,graph,Algorithm,Graph,我正在寻找一个算法,以找到一个无向图中的全局最小割。 我想输入一个图,并通过切割算法输出最小边数。给定的图可以分成两部分 以下是要求: 找到准确的边,而不仅仅是它们的数量 最小切割边应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