我有一个preflow推送网络流算法的实现,它返回流网络的最大流量。我需要的是识别在图中形成切割的饱和边缘集。
在我目前的实现中,我寻找图中空的后边缘的饱和前沿,边缘源到边缘目标的距离大于或等于1(即,源的高度大于或等于1)目标)。如果图中只有一组可能满足最小割的边,则算法可以正常工作,但如果算法可以在图中找到多个切割,则返回图中所有饱和边。我在下面复制了我的代码。任何帮助都非常感谢。
public Set<Edge> cutEdges(){
for (String v_name : vertices.keySet()){
int v_id = vertices.get(v_name);
ArrayList<Edge> veList = residual_edges.get(v_id);
for (Edge ve : veList){
boolean reverseFound = false;
EdgeData vinfo = (EdgeData) ve.getData();
if (vinfo.getAvailable() == 0){
Vertex temp1 = ve.getFirstEndpoint();
Vertex temp2 = ve.getSecondEndpoint();
int u_id = (v_id != vertices.get(temp1.getName().toString()) ?
vertices.get(temp2.getName().toString()) : vertices.get(temp1.getName().toString()));
ArrayList<Edge> ueList = residual_edges.get(u_id);
for (Edge ue : ueList){
EdgeData uinfo = (EdgeData) ue.getData();
if (ue.getFirstEndpoint().getName().toString().equals(temp2.getName().toString()) &&
ue.getSecondEndpoint().getName().toString().equals(temp1.getName().toString())){
if (((VertexData)ue.getFirstEndpoint().getData()).getPreflowHeight() -
((VertexData)ue.getSecondEndpoint().getData()).getPreflowHeight() >= 1){
if (uinfo.getFlow() == 0)
continue;
}
reverseFound = true;
break;
}
}
if (!reverseFound){
if (((VertexData)temp1.getData()).getPreflowHeight() -
((VertexData)temp2.getData()).getPreflowHeight() >= 1)
cut_edges.add(ve);
}
}
}
}
return cut_edges;
}
答案 0 :(得分:1)
我会从问题How can I find the minimum cut on a graph using a maximum flow algorithm?中复制我的答案:
从源顶点开始,沿着仍然存在的边缘进行深度优先搜索 具有剩余容量(即,非饱和边缘)。剪辑包括 所有被“看见”的边缘(即,在被访问者身上发生的事件) 顶点),但由于它们已经饱和而没有被遍历。就像你一样 注意,可能还有其他饱和边缘不属于 最小限度。