// 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);
                }
            }
        }
예제 #4
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);
        }