Java 在预流推送网络流算法中寻找最小割边集
我有一个预流推送网络流算法的实现,它返回流网络的最大流。我需要的是确定在图中形成切割的一组饱和边 在我当前的实现中,我在图中查找从边缘源到边缘目标的距离大于或等于1(即,源的高度大于目标)的带有空后向边的饱和前向边。如果图中只有一组可能的边满足最小割,则该算法工作正常,但如果该算法可以在图中找到多个割,则返回图中的所有饱和边。我复制了下面的代码。非常感谢您的帮助Java 在预流推送网络流算法中寻找最小割边集,java,algorithm,graph-algorithm,pseudocode,Java,Algorithm,Graph Algorithm,Pseudocode,我有一个预流推送网络流算法的实现,它返回流网络的最大流。我需要的是确定在图中形成切割的一组饱和边 在我当前的实现中,我在图中查找从边缘源到边缘目标的距离大于或等于1(即,源的高度大于目标)的带有空后向边的饱和前向边。如果图中只有一组可能的边满足最小割,则该算法工作正常,但如果该算法可以在图中找到多个割,则返回图中的所有饱和边。我复制了下面的代码。非常感谢您的帮助 public Set<Edge> cutEdges(){ for (String v_name : vertice
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);
}
}
}
}
返回切边;
}
我将从问题中复制我的答案:
从源顶点开始,沿静止的边执行深度优先搜索
具有剩余容量(即非饱和边缘)。切口包括
在所有“可见”的边缘中(即,在所访问的
顶点),但未被遍历,因为它们已饱和。像你一样
请注意,可能有其他饱和边不属于
最小切割
可能重复的