示例#1
0
        public static Graf NajkrotszeDrzewo(Graf graf, int start)
        {
            KolejkaPriorytetowa kolejka = new KolejkaPriorytetowa();

            for (int i = 0; i < graf.lista.Count(); i++)
            {
                kolejka.Dodaj(graf.lista[i].start);
            }
            kolejka.Dodaj(kolejka.Kolejka.Count + 1);
            int n = kolejka.Dlugosc;

            int[] cost = new int[n];
            int[] prev = new int[n];
            for (int i = 0; i < n; i++)
            {
                cost[i] = int.MaxValue;
            }
            cost[start] = 0;
            prev[start] = 0;



            kolejka.Porzadkuj(cost);
            while (kolejka.Dlugosc != 0)
            {
                int u = kolejka.Zdejmij();
                for (int i = 0; i < graf.IleKrawedzi(u); i++)
                {
                    int z = graf.lista[i].koniec;
                    if (kolejka.CzyZawiera(z) && cost[z] > graf.lista[i].wartosc)
                    {
                        cost[z] = graf.lista[i].wartosc;
                        prev[z] = u;
                    }
                }
            }
            List <Krawedz> krawedzieWynik = new List <Krawedz>();

            for (int i = 0; i < n; i++)
            {
                krawedzieWynik.Add(new Krawedz(i, prev[i], cost[i]));
            }
            return(new Graf(krawedzieWynik));
        }