2016-08-09 6 views
3

Я пытался реализовать Edmonds-Karp в C++ для максимального потока, и я написал ее немного по-другому:Почему необходимо учитывать задние края в максимальном потоке Edmonds-Karp?

  1. Вместо того, чтобы идти через все ребра в остаточном графе, я пошел только через край, которые присутствуют в исходном графе , используя список смежности.
  2. Я не обновлял обратные края при обновлении остаточного графика с минимальным потоком.

Интересно, когда я запускал свой код, он дал мне правильные результаты. Поэтому я пошел в Wikipedia's example, где он конкретно показал, как используется задний край. Когда я передал этот график моему коду, Я снова получил правильный ответ. Я также проверил итоговую матрицу потока , и он был идентичен Википедии.

Может кто-нибудь объяснить, почему мы должны добавлять и обновлять задние края и, может быть, привести пример, где они критически важны?

Here «s код, который я написал (обновлен, чтобы включить задний края):

+0

Просто быть уверены, чтобы понять, хорошо, означает ли это, что когда вы берете дугу в обратном порядке, вы не обновляете значение потока на этой дуге? –

+0

@DamienProt У меня была идея, что вместо повторения по остаточному графу я просматриваю только исходный список смежности. Поэтому я никогда не посещал ни одного заднего края, и я не видел никакого обновления. – prakharsingh95

ответ

2

Рассмотрим следующую сеть потока enter image description here

Пусть первый поток s → у → v → т. (Если вы возражаете, что что BFS Эдмондс-Карп никогда бы не выбрать этот вариант, затем увеличить график с еще несколько вершин между сек и против и между у и т).

без реверсирования потока → у v, что невозможно получить оптимальный поток 20.

+0

@ prakharsingh95 Я специально обратился к этому в ответ. Добавьте несколько вершин между s и v, u и t, и это именно то, что произойдет. –

+0

BFS сначала открывает кратчайшие пути (количество ребер). Сначала он захватит два 10 пути потока, и 1 край веса не будет рассмотрен. Я просто запустил свой код с вашим графиком, и максимальный поток действительно 20. – prakharsingh95

+1

@ prakharsingh95: Я полностью согласен с ответом Ами Тавори, нет смысла забывать о задних краях. –

2

попробовать следующий случай:

int main() { 
    Digraph<int> g(8); 
    g.addEdge(0,1,1); 
    g.addEdge(1,2,1); 
    g.addEdge(2,4,1); 
    g.addEdge(0,3,1); 
    g.addEdge(3,4,1); 
    g.addEdge(4,7,1); 
    g.addEdge(3,5,1); 
    g.addEdge(5,6,1); 
    g.addEdge(6,7,1); 

    cout<<g.maxFlowEdmondsKarp(0,7); 

    return 0; 
} 

ваша программа выбирает самый короткий путь 0-3-4-7 первой и не имеет возможности найти 0-1-2-4-7 и 0-3-5-6-7. Вы получаете 1, а 2 - правильный ответ.

ли вы вставили обратно-край, чем можно было бы найти следующие пути:

  1. 0-3-4-7
  2. 0-1-2-4-3(back-edge!)-5-6-7, получая максимальный поток 2.
+0

Я думаю, что вы пропустили край 2-4 – prakharsingh95

+0

@ prakharsingh95 благодарит, добавлено сейчас – ead

+0

Спасибо! Просто пример, который я искал. – prakharsingh95

 Смежные вопросы

  • Нет связанных вопросов^_^