Мне кажется, что вы просто спрашиваете, существует ли путь между двумя вершинами в неориентированном графе, но не обязательно, каким может быть этот путь. Это то же самое, что спрашивать, находятся ли две вершины в одном связанном компоненте графа.
Если вам действительно нужно только знать, находятся ли две вершины в одном и том же связанном компоненте, то существует простой и эффективный алгоритм, использующий структуру данных с несвязным множеством .
initialize the disjoint set structure (DSS)
for each edge:
for each vertex in edge:
if the vertex does not exist in the DSS:
create a new subset in the DSS containing only the vertex
merge the subsets of the two vertices
Чтобы определить, существует ли путь между двумя вершинами после обработки всех ребер, просто проверьте, находятся ли две вершины в одном и том же подмножестве. Если они есть, то между ними существует какой-то путь.
При эффективной реализации DSS этот алгоритм достигает чуть хуже линейного времени, и даже при простой реализации DSS со связанным списком это O (n *
log (n)). Как упоминает хакер j _
random _
, Флойд-Варшалл - это O (n ^ 3) времени и O (n ^ 2) памяти независимо от того, рассчитываете ли вы только транзитивное замыкание или нет, а использование алгоритма Дейкстры требует O (n *
log (n)) вычисление для каждого запроса.