Может быть, моя реализация алгоритма медленная или это нормально, что алгоритм максимального потока медленнее, когда число узлов и ребер велико?
Я думаю, что ответ «Да» на оба вопроса:
Согласно странице Википедии о проблеме MaxFlow , сложность решений, которые гарантированно прекратятсявсе O(VE)
или хуже. Алгоритм Эдмондса-Карпа O(VE^2)
.
(V - число вершин, E - количество ребер в графе.)
Короче говоря, все алгоритмы maxflow медленны, есликоличество узлов или ребер велико.
Однако я думаю, что в вашей реализации также есть проблемы. Например, комментарий к методу BFS_
гласит «найти путь от nodeU
до nodeV
, если он существует», но он ищет все пути от nodeU
. Если вы посмотрите на это, аргумент nodeV
не используется.
И есть много микрооптимизаций, которые можно выполнить. Например:
if( visited.get(e.destination()) == null || visited.get(e.destination()) == false )
{
visited.putIfAbsent(e.destination(), true);
path.putIfAbsent(e.destination(), e);
queue.add(e.destination());
}
Вы звоните get
дважды. Второй вызов не нужен, потому что вы никогда не вызываете `put (e.destination (), false). И
visited.putIfAbsent(e.destination(), true);
может быть
visited.put(e.destination(), true);
, потому что не имеет значения, если put
значение true
, когда оно уже введено.