Я пытаюсь реализовать алгоритм минимального разреза Каргера на Java. Для этого я создал класс Graph, в котором хранится SortedMap с целочисленным индексом в качестве ключа и объектом Vertex в качестве значения, а также ArrayList объектов Edge. Edges хранит индекс своих инцидентных вершин. Затем я объединяю вершины некоторого случайного ребра, пока количество вершин не достигнет 2. Я повторяю эти шаги безопасное количество раз. Любопытно, что в моем выводе я получаю в 2 раза больше пересекающихся ребер. Я имею в виду, что если правильный ответ равен 10, после выполнения алгоритма n раз (для n достаточно больших) минимальный результат выполнения равен 20, что заставляет меня поверить, что реализация почти правильная. Это соответствующая часть кода:
void mergeVertex(int iV, int iW) {
for (int i = 0; i < edges.size(); i++) {
Edge e = edges.get(i);
if (e.contains(iW)) {
if (e.contains(iV)) {
edges.remove(i);
i--;
} else {
e.replace(iW, iV);
}
}
}
vertices.remove(iW);
}
public int kargerContraction(){
Graph copy = new Graph(this);
Random r = new Random();
while(copy.getVertices().size() > 2){
int i = r.nextInt(copy.getEdges().size());
Edge e = copy.getEdges().get(i);
copy.mergeVertex(e.getVertices()[0], e.getVertices()[1]);
}
return copy.getEdges().size()/2;
}
Graph
предназначен для ориентированных графов? Попробуйте запустить свой код с более простыми тестовыми данными. Например, дерево, у которого minCut должен быть равен 1. - person r3mainer   schedule 10.08.2015