У меня есть реализация алгоритма потока потока предварительной подачи, который возвращает максимальный поток сети потока.Что мне нужно, это определить набор насыщенных ребер, которые образуют разрез на графике.
В моей текущей реализации я ищу насыщенные передние ребра с пустыми задними ребрами на графике, для которых расстояние от ребраИсточник до краевой цели больше или равен единице (т. е. источник имеет большую высоту, чем цель).Если в графе есть только один возможный набор ребер, удовлетворяющий минимальному разрезу, алгоритм работает нормально, но если алгоритм может найти более одного разреза в графе, он возвращает все насыщенные ребра в графе.Я скопировал мой код ниже.Любая помощь высоко ценится.
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;
}