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); }
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/ }
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 }