Java 在预流推送网络流算法中寻找最小割边集

Java 在预流推送网络流算法中寻找最小割边集,java,algorithm,graph-algorithm,pseudocode,Java,Algorithm,Graph Algorithm,Pseudocode,我有一个预流推送网络流算法的实现,它返回流网络的最大流。我需要的是确定在图中形成切割的一组饱和边 在我当前的实现中,我在图中查找从边缘源到边缘目标的距离大于或等于1(即,源的高度大于目标)的带有空后向边的饱和前向边。如果图中只有一组可能的边满足最小割,则该算法工作正常,但如果该算法可以在图中找到多个割,则返回图中的所有饱和边。我复制了下面的代码。非常感谢您的帮助 public Set<Edge> cutEdges(){ for (String v_name : vertice

我有一个预流推送网络流算法的实现,它返回流网络的最大流。我需要的是确定在图中形成切割的一组饱和边

在我当前的实现中,我在图中查找从边缘源到边缘目标的距离大于或等于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;
}
公共集剪切边(){
对于(字符串v_名称:顶点.keySet()){
int v_id=顶点.get(v_名称);
ArrayList veList=剩余的_边.get(v_id);
用于(边缘ve:veList){
布尔倒数found=false;
EdgeData vinfo=(EdgeData)ve.getData();
if(vinfo.getAvailable()==0){
顶点temp1=ve.getFirstEndpoint();
顶点temp2=ve.getSecondEndpoint();
int u_id=(v_id!=顶点.get(temp1.getName().toString())?
顶点.get(temp2.getName().toString()):顶点.get(temp1.getName().toString());
ArrayList ueList=剩余的_边.get(u_id);
用于(边缘ue:ueList){
EdgeData uinfo=(EdgeData)ue.getData();
如果(ue.getFirstEndpoint().getName().toString().equals(temp2.getName().toString())&&
ue.getSecondEndpoint().getName().toString().equals(temp1.getName().toString()){
如果(((VertexData)ue.getFirstEndpoint().getData()).getPreflowHeight()-
((VertexData)ue.getSecondEndpoint().getData()).getPreflowHeight()>=1){
if(uinfo.getFlow()==0)
继续;
}
reverseFound=true;
打破
}
}
如果(!reverseFound){
如果(((VertexData)temp1.getData()).getPreflowHeight()-
((VertexData)temp2.getData()).getPreflowHeight()>=1)
切割边缘。添加(ve);
}
}
}
}
返回切边;
}

我将从问题中复制我的答案:

从源顶点开始,沿静止的边执行深度优先搜索 具有剩余容量(即非饱和边缘)。切口包括 在所有“可见”的边缘中(即,在所访问的 顶点),但未被遍历,因为它们已饱和。像你一样 请注意,可能有其他饱和边不属于 最小切割

可能重复的