// metoda publiczna zwracająca listę wierzchołków wchodzących w skład cyklu public List <Wierzcholek> ZnajdzCykl(Graf graf, Wierzcholek poczatek) { List <Wierzcholek> rezultat; rezultat = new List <Wierzcholek>(); if (!graf.PosiadaCyklEulera()) { UzupelnijNieparzysteKrawedzie(graf); } ZnajdzCyklRekurencyjnie(poczatek, ref rezultat); return(rezultat); }
// główna funkcja programu public static void Main(string[] args) { // zmienne lokalne Graf graf; Algorytm algorytm; List <Wierzcholek> cykl; // utworzenie grafu (graf można podejrzeć w pliku WizualizacjaGrafu.jpg) graf = new Graf(); graf.DodajKrawedz("0", "4", 1.0); graf.DodajKrawedz("0", "5", 1.0); graf.DodajKrawedz("1", "2", 1.0); graf.DodajKrawedz("1", "3", 1.0); graf.DodajKrawedz("1", "4", 1.0); graf.DodajKrawedz("1", "5", 1.0); graf.DodajKrawedz("2", "3", 1.0); graf.DodajKrawedz("2", "4", 1.0); graf.DodajKrawedz("2", "5", 1.0); graf.DodajKrawedz("4", "5", 1.0); graf.DodajKrawedz("5", "6", 1.0); // utworzenie algorytmu algorytm = new Algorytm(); // próba znalezienia cyklu cykl = algorytm.ZnajdzCykl(graf, graf.ZnajdzWierzcholek("0")); // wypisanie cyklu na konsolę jeżeli znaleziono if (cykl.Count > 0) { Console.Write("Znaleziono cykl: "); foreach (Wierzcholek wierzcholek in cykl) { Console.Write(wierzcholek.Nazwa + " "); } } // graf nie posiada cyklu (najepewniej jest to graf niespójny) else { Console.WriteLine("Nie znaleziono cyklu."); } Console.WriteLine(); // oczekiwanie, aż użytkownik wciśnie dowolny klawisz Console.ReadKey(); }
private void UzupelnijNieparzysteKrawedzie(Graf graf) { Wierzcholek a, b; Dijkstra dijkstra; List <Wierzcholek> sciezka; int i; dijkstra = new Dijkstra(); while (true) { a = null; foreach (Wierzcholek wierzcholek in graf.Wierzcholki) { if ((wierzcholek.Krawedzie.Count % 2) != 0) { a = wierzcholek; break; } } b = null; foreach (Wierzcholek wierzcholek in graf.Wierzcholki) { if (wierzcholek != a && (wierzcholek.Krawedzie.Count % 2) != 0) { b = wierzcholek; break; } } if (a == null && b == null) { break; } sciezka = dijkstra.Szukaj(graf, a, b); for (i = 0; i < sciezka.Count - 1; i++) { graf.DodajKrawedz(sciezka[i].Nazwa, sciezka[i + 1].Nazwa, 1.0); } } }
public List <Wierzcholek> Szukaj(Graf graf, Wierzcholek start, Wierzcholek stop) { DP[] dp; List <Wierzcholek> sciezka; int i; dp = Szukaj(graf, start); i = ZnajdzIndeksWiercholka(dp, stop); sciezka = new List <Wierzcholek>(); while (i != -1) { sciezka.Insert(0, dp[i].Wierzcholek); i = dp[i].Poprzednik; } return(sciezka); }