在预流推送网络流算法中查找MinCut边缘集

时间:2011-11-11 02:39:38

标签: java algorithm graph-algorithm pseudocode

我有一个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;
}

1 个答案:

答案 0 :(得分:1)

我会从问题How can I find the minimum cut on a graph using a maximum flow algorithm?中复制我的答案:

  

从源顶点开始,沿着仍然存在的边缘进行深度优先搜索   具有剩余容量(即,非饱和边缘)。剪辑包括   所有被“看见”的边缘(即,在被访问者身上发生的事件)   顶点),但由于它们已经饱和而没有被遍历。就像你一样   注意,可能还有其他饱和边缘不属于   最小限度。