Exemple #1
0
        private void btnDatoteka_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();

            dlg.Title = "Datoteka s popisom čvorova i udaljenosti";
            if (dlg.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            Graf g = new Graf();

            string dat = dlg.FileName;

            using (StreamReader sr = File.OpenText(dat))
            {
                string linija = sr.ReadLine();
                while (linija != null)
                {
                    string[] s = linija.Split(';');

                    //spremi u graf

                    CvorGrafa poc    = new CvorGrafa(char.Parse(s[0]));
                    CvorGrafa kraj   = new CvorGrafa(char.Parse(s[1]));
                    int       tezina = int.Parse(s[2]);
                    g.DodajBrid(poc, kraj, tezina);
                    //sljedeća
                    linija = sr.ReadLine();
                }
            }

            //računanje i ispis udaljenosti
            g.BellmanFord(0, rtbIspis);
        }
Exemple #2
0
        public void BellmanFord(int pocetni, RichTextBox rtb)
        {
            Graf g = this;

            int brCv = g.brCvor;
            int brBr = g.brBrid;

            Dictionary <char, int> dict = new Dictionary <char, int>();

            // 1. postavi sve udaljenosti na beskonačno, početni na 0
            foreach (CvorGrafa c in g.Cvorovi)
            {
                dict[c.Oznaka] = int.MaxValue;
            }
            CvorGrafa cg = this.Cvorovi[pocetni];

            dict[cg.Oznaka] = 0;

            // 2. računaj n-1 puta za svaki čvor, n je broj bridova

            for (int i = 0; i < g.Cvorovi.Count; i++)
            {
                for (int j = 0; j < brBr; j++)
                {
                    char u        = g.Bridovi[j].pocetak.Oznaka;
                    char v        = g.Bridovi[j].kraj.Oznaka;
                    int  tezinaUV = g.Bridovi[j].tezina;
                    if (dict[u] != int.MaxValue && dict[v] > dict[u] + tezinaUV)
                    {
                        dict[v] = dict[u] + tezinaUV;
                    }
                }
            }

            for (int j = 0; j < brBr; j++)
            {
                char u        = g.Bridovi[j].pocetak.Oznaka;
                char v        = g.Bridovi[j].kraj.Oznaka;
                int  tezinaUV = g.Bridovi[j].tezina;
                if (dict[u] != int.MaxValue && dict[v] > dict[u] + tezinaUV)
                {
                    MessageBox.Show("Graf ima negativne cikluse");
                }
            }
            foreach (char k in dict.Keys)
            {
                rtb.AppendText(k.ToString() + "\t" + dict[k] + "\n");
            }
            // https://www.geeksforgeeks.org/bellman-ford-algorithm-dp-23/
        }
Exemple #3
0
        public void DodajBrid(CvorGrafa poc, CvorGrafa kraj, int t)
        {
            Brid b = new Brid();

            Bridovi.Add(b);
            b.pocetak = poc;
            b.kraj    = kraj;
            b.tezina  = t;

            if (!Cvorovi.Contains(poc))
            {
                Cvorovi.Add(poc);
            }
            if (!Cvorovi.Contains(kraj))
            {
                Cvorovi.Add(kraj);
            }

            this.brBrid = Bridovi.Count;
            this.brCvor = Cvorovi.Count;
            //sprema bridove i čvorove
        }