public static List <rura> zrobSiecRezywualna(List <rura> siec) { List <rura> rezywualna = new List <rura>(); foreach (rura r in siec) { int przeplyw = r.dajPrzeplyw(); int rezerwa = r.wolnyPrzeplyw(); string a = r.skad(); string b = r.dokad(); if (przeplyw != 0) { rura powrot = new rura(b, a, przeplyw); rezywualna.Add(powrot); } if (rezerwa != 0) { rura dodatek = new rura(a, b, rezerwa); rezywualna.Add(dodatek); } } return(rezywualna); }
static void Main(string[] args) { List <rura> siec = new List <rura>(); var s = new FileInfo(Directory.GetCurrentDirectory()); var s2 = s.Directory.Parent.Parent; String sciezka = s2.ToString() + "\\dane.csv"; using (var reader = new StreamReader(sciezka)) { while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(','); rura nowa = new rura(values[0], values[1], Convert.ToInt32(values[2])); siec.Add(nowa); } } foreach (rura r in siec) { r.napisz(); } Console.WriteLine(); bool zrobiono = false; int max = 0; while (true) { List <rura> rezywualna = zrobSiecRezywualna(siec); List <string> sciezkaPowiekszajaca = BFS(rezywualna); if (sciezkaPowiekszajaca == null) { break; } zrobiono = true; string opis = "Ściezka powiększająca: "; foreach (string sc in sciezkaPowiekszajaca) { opis += sc; opis += ", "; } int maksimum = -1; bool znalazl; for (int x = 0; x < (sciezkaPowiekszajaca.Count) - 1; x++) { znalazl = false; foreach (rura r in siec) { if (r.skad() == sciezkaPowiekszajaca.ElementAt(x) && r.dokad() == sciezkaPowiekszajaca.ElementAt(x + 1)) { znalazl = true; if (maksimum == -1) { maksimum = r.wolnyPrzeplyw(); break; } else { if (r.wolnyPrzeplyw() < maksimum) { maksimum = r.wolnyPrzeplyw(); } break; } } } if (znalazl == false) { foreach (rura r in siec) { if (r.dokad() == sciezkaPowiekszajaca.ElementAt(x) && r.skad() == sciezkaPowiekszajaca.ElementAt(x + 1)) { if (r.dajPrzeplyw() < maksimum) { maksimum = r.dajPrzeplyw(); } break; } } } } opis += "przepływ ścieżki równy "; opis += maksimum; Console.WriteLine(opis); for (int x = 0; x < (sciezkaPowiekszajaca.Count) - 1; x++) { znalazl = false; foreach (rura r in siec) { if (r.skad() == sciezkaPowiekszajaca.ElementAt(x) && r.dokad() == sciezkaPowiekszajaca.ElementAt(x + 1)) { znalazl = true; r.powiekszPrzeplyw(maksimum); } } if (znalazl == false) { foreach (rura r in siec) { if (r.dokad() == sciezkaPowiekszajaca.ElementAt(x) && r.skad() == sciezkaPowiekszajaca.ElementAt(x + 1)) { r.pomniejszPrzeplyw(maksimum); } } } } max += maksimum; } if (zrobiono == true) { Console.WriteLine("Brak dalszych ścieżek powiększających."); Console.WriteLine("Maksymalny przepływ sieci wynosi " + max); } else { Console.WriteLine("Sieć nie ma ścieżki ze źródła do ujścia"); Console.ReadKey(); return; } Console.WriteLine(); List <rura> rezywualna2 = zrobSiecRezywualna(siec); List <string> zrodlowe = BFS2(rezywualna2); List <string> ujsciowe = znajdzReszte(siec, zrodlowe); List <rura> rozciecie = new List <rura>(); foreach (rura r in siec) { if (czyNaLiscie(zrodlowe, r.skad()) == true && czyNaLiscie(ujsciowe, r.dokad()) == true) { rozciecie.Add(r); } } Console.WriteLine("Minimalny przekroj:"); foreach (rura r in rozciecie) { r.napisz(); } Console.ReadKey(); }