Я почти уверен, что это не самый эффективный способ, но это будет моя первая попытка:
Сначала поменяйте ребра вершинами. Итак, для ваших примеров циклов 1-2-3-4
, 3-4-5-6
и 5-6-7-8
вам понадобится:
"12" => "A"
"23" => "B"
"34" => "C"
"45" => "D"
"56" => "E"
"67" => "F"
"78" => "G"
"41" => "H"
"63" => "I"
"85" => "J"
Это дает вам до (v * (v-1)) / 2 вершин, но хорошо - это может все же быть достаточно хорошо для алгоритма O (v ^ 2).
Затем представьте циклы как битовые поля:
"1-2-3-4" становится ABCH
ABCDEFGHIJ
1110000100
и "3-4-5-6" становится CDEI
ABCDEFGHIJ
0011100010
Таким образом, у них есть ровно один общий бит, что означает, что в исходном графе у них было ровно одно ребро. Это можно проверить либо побитово с помощью O (v ^ 2), либо с помощью двоичного поиска (сначала проверьте с помощью ANDing, если у них есть какой-либо общий бит, затем проверьте ANDing в первой половине бит и т.