// menjamo boju datog cvora void changeNodeColor(int index, Color color, int ms) { ucCanvas.changeNodeColor(index, color, ms); }
// Dugme za Floyd Warshallov algoritam private void floydBtn_Click(object sender, EventArgs e) { ucCanvas.reset_colors(); // Resetujemo boje var noNodes = Platno.numberOfNodes; // Makar dva cvora neophodna za pocetak rada if (noNodes < 2) { MessageBox.Show("Ubacite makar dva čvora, zatim pokušajte ponovo."); return; } warshallMatrix = new double[noNodes, noNodes]; // Matrica rastojanja double[,] path = new double[noNodes, noNodes]; // Matrica puta // Inicijalizacija tezinske matrice i matrice puta foreach (var i in nodes) { foreach (var j in nodes) { var vr = i.weights.Find(x => x.Key == j.ID).Value; if (i == j) { warshallMatrix[i.ID, j.ID] = 0; } else if (vr == 0) { warshallMatrix[i.ID, j.ID] = double.PositiveInfinity; } else { warshallMatrix[i.ID, j.ID] = vr; } if (i.Connected.Any(a => a == j.ID)) { path[i.ID, j.ID] = j.ID; } else { path[i.ID, j.ID] = double.PositiveInfinity; } } } for (int i = 0; i < noNodes; i++) { path[i, i] = i; } for (var i = 0; i < noNodes; i++) // Novi cvor preko koga se ide { for (var j = 0; j < noNodes; j++) // sledece dve petlje prolaze kroz sve puteve izmedju cvorova { for (var k = 0; k < noNodes; k++) { if (warshallMatrix[j, k] > warshallMatrix[j, i] + warshallMatrix[i, k]) // pitamo se da li je kraci put preko novog cvora { warshallMatrix[j, k] = warshallMatrix[j, i] + warshallMatrix[i, k]; // ako jeste, on postaje novi put (distance) path[j, k] = path[j, i]; // dodajemo u putanju odgovarajuci cvor } } } } // Ako je ovu funkciju pozvalo dugme za Floyd-ov algoritam ispisujemo matricu rastojanja if (sender == floydBtn) { var resForm = new resultsMatrices(null, noNodes, 2, -1, this); resForm.Show(); } else if (sender == prikazSredisteBtn) // ukoliko ju je pozvalo dugme za srediste radimo sledece { var rowsMaxes = new List <double>(noNodes); // lista maksimalnih vrednosti potrebna za odredjivanje sredista grafa for (var i = 0; i < noNodes; i++) { // Ukoliko je rastojanje bilo plus beskonacno pretvaramo ga u minus beskonacno i dodajemo u listu, u suprotnom samo dodajemo pocetne vrednosti u listu if (warshallMatrix[i, 0] == double.PositiveInfinity) { rowsMaxes.Add(double.NegativeInfinity); } else { rowsMaxes.Add(warshallMatrix[i, 0]); } // proveravamo da li u ostatku redova matrice postoji neka vrednost veca od odgovarajuce vrednosti u listi maksimalnih // za odgovarajucu vrstu, ukoliko postoji onda ona postaje nova maksimalna vrednost for (var j = 1; j < noNodes; j++) { if (warshallMatrix[i, j] > rowsMaxes[i] && warshallMatrix[i, j] != double.PositiveInfinity) { rowsMaxes[i] = warshallMatrix[i, j]; } } } // inicijalizujemo minimalnu vrednost na prvi element liste var minValue = rowsMaxes[0]; // ukoliko je slucajno prva vrednost bila -beskonacno trazimo prvu koja nije to i nju postavljamo kao minimalnu liste for (var i = 1; i < noNodes; i++) { if (rowsMaxes[i] != double.NegativeInfinity) { minValue = rowsMaxes[i]; break; } } // ako postoji vise sredista var sredistaLista = new List <int>(); // gledamo da li postoji manja vrednost od nase prethodne, inicijalizovane for (var i = 0; i < noNodes; i++) { if (rowsMaxes[i] == double.NegativeInfinity) { continue; } if (rowsMaxes[i] < minValue) { minValue = rowsMaxes[i]; } } StringBuilder sb = new StringBuilder(); // pravimo poruku o sredistima grafa for (var i = 0; i < noNodes; i++) { if (rowsMaxes[i] == minValue) // sredista su ako imaju minimalnu vrednost u nizu maksimalnih vrednosti svake vrste { ucCanvas.changeNodeColor(i, Color.Goldenrod, 0); // menjamo im boju i dodajemo u poruku sb.Append(" " + i.ToString()); } } MessageBox.Show("Središte grafa je čvor " + sb.ToString()); // ispis poruke } else // Ukoliko je funkcija pozvana od strane dugmeta za prikaz puta { var start = int.Parse(prviCvorCb.SelectedItem.ToString()); var end = int.Parse(drugiCvorCb.SelectedItem.ToString()); var travel = new List <int>(); var noWay = false; if (start == end) { MessageBox.Show("Ne postoji najkraći put od čvora do samog sebe."); return; } // Prolazimo kroz matricu puta i u niz travel koji predstavlja ,,put'' od cvora start do end // dodajemo sve indekse ostalih cvorova preko kojih idemo travel.Add(start); while (start != end) { if (path[start, end] == double.PositiveInfinity) { noWay = true; break; // ukoliko naidjemo na +beskonacno ne postoji put od start do end cvora } start = (int)path[start, end]; travel.Add(start); } // ukoliko je put veci od jedan i postoji put od cvora do cvora promenicemo boje izmedju njih u suprotnom ne postoji put if (travel.Count != 1 && noWay == false) { int i; for (i = 0; i < travel.Count - 1; i++) { ucCanvas.changeConnectionColor(travel[i], travel[i + 1], Color.Orange, 0); } ucCanvas.changeConnectionColor(travel[i - 1], end, Color.Orange, 0); } else if (noWay == true) { MessageBox.Show("Ne postoji put između odabranih čvorova."); return; } } }