1.Znajdź wszystkie silnie spójne, bo tylko w silnych istnieją cykle (dość proste do udowodnienia, bo jeśli idąc z jakiegoś wierzchołka przez inne silnie spójne(przechodząc przez wierzchołek x) z powrotem do niego, to wierzchołek x możemy "zamienić" z wierzchołkiem z jego spójnej, analogicznie dla każdego wierzchołka w każdej spójnej - to powinna być jedna spójna, czyli sprzeczność)
2.Dla każdej silnie spójnej trzeba cofać się Bfs'em bez zapamiętywania odwiedzonych nie dalej niż na rozmiar silnej. Jeśli trafimy na źródło naszego Bfs to zwracamy cykl.
Ten algorytm jest strasznie wolny, ale na pewno poprawny. Zwraca zduplikowane cykle, ale to można łatwo wykryć. Później spróbuję go przyspieszyć.
edit
Mam algorytm liniowy o(n*m) względem ilości cykli w grafie.
- Znajdź wszystkie silnie spójne
- Wybieram jedną krawędź w spójnej(a->b) i znajduje wszystkie ścieżki z b do a
- Usuwam tą krawędz i biorę następną
Jak wyszukiwać wszystkie ścieżki z b do a?
1.Zapuszczam dfs na grafie z wierzchołka b wyznacząjąc dla każdego wierzchołka wszystkich jego ojców(vector)
2.Tworzę funkcję f(x,y,cykl):
-jeśli (x==y) cykle.push_back(cykl+y);
-inaczej foreach(ojcowe[x] jako a)f(a,y,cykl+a)
3.Wywoluje tą funkcję f(a,b,""), ktora dodaje wszystkie cykle do vectora cykle
Jeśli coś jest źle to śmiało poprawiajcie