问题描述
我正在尝试了解我的家庭作业的 edmond karp 算法。我找到了一个关于最大流算法的网站,并且有一个运行流畅的 cod。但是,对代码没有评论。因为我不能了解变量名称以及代码的工作原理。我希望有人可以帮助我使用该算法。我将给出下面的链接和代码。如果有人可以解释变量及其用途,我将不胜感激。 如果您能找到导致瓶颈的边缘,那就太好了。我如何确定此代码中的边缘导致瓶颈。
https://sites.google.com/site/indy256/algo/edmonds_karp
public class MaxFlowEdmondsKarp {
static class Edge {
int s,t,rev,cap,f;
public Edge(int s,int t,int rev,int cap) {
this.s = s;
this.t = t;
this.rev = rev;
this.cap = cap;
}
}
public static List<Edge>[] createGraph(int nodes) {
List<Edge>[] graph = new List[nodes];
for (int i = 0; i < nodes; i++)
graph[i] = new ArrayList<>();
return graph;
}
public static void addEdge(List<Edge>[] graph,int s,int cap) {
graph[s].add(new Edge(s,graph[t].size(),cap));
graph[t].add(new Edge(t,s,graph[s].size() - 1,0));
}
public static int maxFlow(List<Edge>[] graph,int t) {
int flow = 0;
int[] q = new int[graph.length];
while (true) {
int qt = 0;
q[qt++] = s;
Edge[] pred = new Edge[graph.length];
for (int qh = 0; qh < qt && pred[t] == null; qh++) {
int cur = q[qh];
for (Edge e : graph[cur]) {
if (pred[e.t] == null && e.cap > e.f) {
pred[e.t] = e;
q[qt++] = e.t;
}
}
}
if (pred[t] == null)
break;
int df = Integer.MAX_VALUE;
for (int u = t; u != s; u = pred[u].s)
df = Math.min(df,pred[u].cap - pred[u].f);
for (int u = t; u != s; u = pred[u].s) {
pred[u].f += df;
graph[pred[u].t].get(pred[u].rev).f -= df;
}
flow += df;
}
return flow;
}
// Usage example
public static void main(String[] args) {
List<Edge>[] graph = createGraph(3);
addEdge(graph,1,3);
addEdge(graph,2,2);
addEdge(graph,2);
System.out.println(4 == maxFlow(graph,2));
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)