C++ MAXFLOW-MINCUT代码中存在错误
我已经使用edmonds karp实现编写了一个Max Flow类。当我尝试获取最大流的值时,代码似乎工作正常。我在SPOJ上提交了代码,所以我相信实现是正确的 但是我试图从残差图中得到最小割。这导致了一些错误。任何帮助都是有用的C++ MAXFLOW-MINCUT代码中存在错误,c++,max-flow,C++,Max Flow,我已经使用edmonds karp实现编写了一个Max Flow类。当我尝试获取最大流的值时,代码似乎工作正常。我在SPOJ上提交了代码,所以我相信实现是正确的 但是我试图从残差图中得到最小割。这导致了一些错误。任何帮助都是有用的 #include <iostream> #include <vector> #include <queue> using namespace std; class EdmondsKarp { private: vecto
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
class EdmondsKarp
{
private:
vector<vector<int>> graph;
vector<vector<int>> rGraph;
vector<vector<int>> capacities;
vector<int> parent;
vector<bool> visited;
int source, sink;
int flow;
public:
EdmondsKarp(vector<vector<int>> graph, vector<vector<int>> capacities, int source, int sink)
{
this->graph = graph;
this->capacities = capacities;
this->rGraph = capacities;
this->source = source;
this->sink = sink;
parent.resize(rGraph.size());
visited.resize(rGraph.size());
makeFlow();
}
bool bfs()
{
for (int i = 0; i < visited.size(); i++)
{
visited[i] = false;
}
queue<int> q;
visited[source] = true;
parent[source] = -1;
q.push(source);
int qf, v;
while (!q.empty())
{
qf = q.front();
q.pop();
for (int i = 0; i < graph[qf].size(); i++)
{
v = graph[qf][i];
if (!visited[v] && rGraph[qf][v] > 0)
{
q.push(v);
parent[v] = qf;
visited[v] = true;
}
}
}
return visited[sink];
}
int makeFlow()
{
int INF = 9 + 1e9;
flow = 0;
int u, v, path_flow;
while (bfs())
{
path_flow = INF;
for (v = sink; v != source; v = parent[v])
{
u = parent[v];
path_flow = min(path_flow, rGraph[u][v]);
}
for (v = sink; v != source; v = parent[v])
{
u = parent[v];
rGraph[u][v] -= path_flow;
rGraph[v][u] += path_flow;
}
flow += path_flow;
}
return 1;
}
int getFlow()
{
return flow;
}
vector<vector<int>> getFlowGraph()
{
vector<vector<int>> flowGraph(capacities.size(), vector<int>(capacities.size(), 0));
for (int i = 0; i < capacities.size(); i++)
{
for (int j = 0; j < capacities[i].size(); j++)
{
if (capacities[i][j] > 0)
{
flowGraph[i][j] = capacities[i][j] - rGraph[i][j];
}
}
}
return flowGraph;
}
vector<int> getMinCut()
{
vector<int> cut;
bfs();
int cutsize = 0;
for (int i = 0; i < visited.size(); i++)
{
if (visited[i])
{
cut.push_back(i);
for (int j = 0; j < graph[i].size(); j++)
{
if (!visited[graph[i][j]])
{
cutsize += capacities[i][graph[i][j]];
}
}
}
}
cout << cutsize << endl;
return cut;
}
};
#包括
#包括
#包括
使用名称空间std;
埃德蒙斯卡普级
{
私人:
矢量图;
矢量图形;
媒介容量;
载体亲本;
访问的病媒;
int源、汇;
int流;
公众:
EdmondsKarp(矢量图、矢量容量、整数源、整数汇)
{
这个->图=图;
这->容量=容量;
这->rGraph=容量;
此->源=源;
这个->水槽=水槽;
resize(rGraph.size());
resize(rGraph.size());
makeFlow();
}
布尔bfs()
{
对于(int i=0;i0)
{
q、 推(v);
母公司[v]=qf;
访问[v]=正确;
}
}
}
回访[沉没];
}
int makeFlow()
{
int INF=9+1e9;
流量=0;
int u,v,路径u流;
while(bfs())
{
路径_流量=INF;
对于(v=sink;v!=source;v=parent[v])
{
u=父项[v];
路径流量=最小值(路径流量,rGraph[u][v]);
}
对于(v=sink;v!=source;v=parent[v])
{
u=父项[v];
rGraph[u][v]=路径流;
rGraph[v][u]+=路径流;
}
流量+=路径\流量;
}
返回1;
}
int getFlow()
{
回流;
}
向量getFlowGraph()
{
向量流程图(capacities.size(),向量(capacities.size(),0));
对于(int i=0;i0)
{
流程图[i][j]=容量[i][j]-rGraph[i][j];
}
}
}
返回流程图;
}
向量getMinCut()
{
矢量切割;
bfs();
int cutsize=0;
对于(int i=0;i>x>>y>>w;
图[x]。推回(y);
容量[x][y]+=w;
图[y]。推回(x);
容量[y][x]+=w;
}
EdmondsKarp edk(图形,容量,'A','Z');
edk.getMinCut();
}
因此,我设法修复了getMinCut函数。不幸的是,我没有找出原始代码中的错误。我也没有运行所有可能的边组合,并将适当的边添加到剪切中
vector<int> getMinCut()
{
vector<int> cut;
bfs();
for (int i = 0; i < visited.size(); i++)
{
if(visited[i])
{
cut.push_back(i);
}
}
int cutsize = 0;
for (int i = 0; i < graph.size(); i++)
{
for (int j = 0; j < graph.size(); j++)
{
if(visited[i] && !visited[j])
{
cutsize += capacities[i][j];
}
}
}
cout << cutsize << endl;
return cut;
}
向量getMinCut()
{
矢量切割;
bfs();
对于(int i=0;ivector<int> getMinCut()
{
vector<int> cut;
bfs();
for (int i = 0; i < visited.size(); i++)
{
if(visited[i])
{
cut.push_back(i);
}
}
int cutsize = 0;
for (int i = 0; i < graph.size(); i++)
{
for (int j = 0; j < graph.size(); j++)
{
if(visited[i] && !visited[j])
{
cutsize += capacities[i][j];
}
}
}
cout << cutsize << endl;
return cut;
}