// koniec metody bez grafu public static void ProblemKomiwojazera(Graph graph, int startWierzcholek) { List <int> odwiedzoneMiasta = new List <int>(); List <Roads> sciezka = new List <Roads>(); Dictionary <int, string> slownikMiast = new Dictionary <int, string>(); slownikMiast.Add(1, "Warszawa"); slownikMiast.Add(2, "Kraków"); slownikMiast.Add(3, "Łódź"); slownikMiast.Add(4, "Wrocław"); slownikMiast.Add(5, "Poznań"); slownikMiast.Add(6, "Gdańsk"); slownikMiast.Add(7, "Szczecin"); slownikMiast.Add(8, "Bydgoszcz"); slownikMiast.Add(9, "Lublin"); slownikMiast.Add(10, "Katowice"); Console.WriteLine("Proszę podać numer miasta z którego rozpoczyna trasę komiwojażer."); for (int k = 1; k <= slownikMiast.Count; k++) { Console.WriteLine("{0} - {1}", k, slownikMiast[k]); } //int miasto = Convert.ToInt32(Console.ReadLine()); int miasto = startWierzcholek; Console.WriteLine("Rozpoczynam wedrowke z miasta {0}.", miasto); odwiedzoneMiasta.Add(miasto); do { Roads najblizszeMiasto = ZnajdzNajblizszeMiasto(graph, miasto, odwiedzoneMiasta, slownikMiast); odwiedzoneMiasta.Add(najblizszeMiasto.To); miasto = najblizszeMiasto.To; sciezka.Add(najblizszeMiasto); }while (odwiedzoneMiasta.Count < graph.NVerticies); int drogaDoPowrotu = 0; foreach (Edge edge in graph.Edges) { if (edge.From == odwiedzoneMiasta[odwiedzoneMiasta.Count - 1] && edge.To == odwiedzoneMiasta[0]) { drogaDoPowrotu = edge.Weight; } } int ostatnieMiasto = odwiedzoneMiasta[odwiedzoneMiasta.Count - 1]; int dom = odwiedzoneMiasta[0]; Console.WriteLine("Powrót: {0} do miasta {1}, dlugosc drogi: {2} km", slownikMiast[ostatnieMiasto], slownikMiast[dom], drogaDoPowrotu); int odl = 0; foreach (Roads droga in sciezka) { odl += droga.HowLong; } odl += drogaDoPowrotu; Console.WriteLine("Calkowita przebyta droga: {0}", odl); }
public static Roads ZnajdzNajblizszeMiasto(Graph graph, int miasto, List <int> odwiedzoneMiasta, Dictionary <int, string> slownikMiast) { Roads drogaDoNajblizszegoMiasta = new Roads(); int odleglosc = 1000000000; int kolejneMiasto = miasto; bool nieodwiedzone = true; foreach (Edge road in graph.Edges) { if (road.From == miasto) { if (road.Weight < odleglosc && road.To != miasto) { foreach (int odwiedzone in odwiedzoneMiasta) { if (odwiedzone == road.To) { nieodwiedzone = false; } } if (nieodwiedzone) { odleglosc = road.Weight; kolejneMiasto = road.To; } nieodwiedzone = true; } } } drogaDoNajblizszegoMiasta.From = miasto; drogaDoNajblizszegoMiasta.To = kolejneMiasto; drogaDoNajblizszegoMiasta.HowLong = odleglosc; Console.WriteLine("Jestem w miescie {0}, szukam najbliższego miasta. Najblizsze miasto to {1} do ktorego jest {2} km", slownikMiast[miasto], slownikMiast[kolejneMiasto], odleglosc); return(drogaDoNajblizszegoMiasta); }
public static void ProblemKomiwojazeraBezWczytywaniaGrafu() { int[,] tabelaMiast = new int[10, 10] { { 0, 296, 133, 389, 311, 360, 558, 260, 168, 291 }, { 296, 0, 262, 272, 445, 564, 645, 450, 280, 82 }, { 133, 262, 0, 219, 201, 337, 449, 223, 287, 193 }, { 389, 272, 219, 0, 164, 459, 377, 277, 429, 194 }, { 311, 445, 201, 164, 0, 316, 243, 140, 467, 367 }, { 360, 564, 337, 459, 316, 0, 366, 170, 508, 531 }, { 558, 645, 449, 377, 243, 366, 0, 258, 711, 568 }, { 260, 450, 223, 277, 140, 170, 258, 0, 427, 416 }, { 168, 280, 287, 429, 467, 508, 711, 427, 0, 343 }, { 291, 82, 193, 194, 367, 531, 568, 416, 343, 0 }, }; List <int> odwiedzoneMiasta = new List <int>(); List <Roads> sciezka = new List <Roads>(); Dictionary <int, string> slownikMiast = new Dictionary <int, string>(); slownikMiast.Add(0, "Warszawa"); slownikMiast.Add(1, "Kraków"); slownikMiast.Add(2, "Łódź"); slownikMiast.Add(3, "Wrocław"); slownikMiast.Add(4, "Poznań"); slownikMiast.Add(5, "Gdańsk"); slownikMiast.Add(6, "Szczecin"); slownikMiast.Add(7, "Bydgoszcz"); slownikMiast.Add(8, "Lublin"); slownikMiast.Add(9, "Katowice"); Console.WriteLine("Proszę podać numer miasta z którego rozpoczyna trasę komiwojażer."); for (int k = 0; k < slownikMiast.Count; k++) { Console.WriteLine("{0} - {1}", k, slownikMiast[k]); } int miasto = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Rozpoczynam wedrowke z miasta {0}.", miasto); int miastoZktoregoStartuje = miasto; odwiedzoneMiasta.Add(miastoZktoregoStartuje); do { Roads drogaDoNajblizszegoMiasta = new Roads(); int odleglosc = 1000000000; int kolejneMiasto = miasto; bool nieodwiedzone = true; for (int d = 0; d < tabelaMiast.GetLength(0); d++) { if (tabelaMiast[miasto, d] < odleglosc && miasto != d) { foreach (int odwiedzone in odwiedzoneMiasta) { if (odwiedzone == d) { nieodwiedzone = false; } } if (nieodwiedzone) { odleglosc = tabelaMiast[miasto, d]; kolejneMiasto = d; } nieodwiedzone = true; } drogaDoNajblizszegoMiasta.From = miasto; drogaDoNajblizszegoMiasta.To = kolejneMiasto; drogaDoNajblizszegoMiasta.HowLong = odleglosc; } odwiedzoneMiasta.Add(drogaDoNajblizszegoMiasta.To); miasto = drogaDoNajblizszegoMiasta.To; sciezka.Add(drogaDoNajblizszegoMiasta); Console.WriteLine("Jestem w miescie {0}, szukam najbliższego miasta. Najblizsze miasto to {1} do ktorego jest {2} km", slownikMiast[drogaDoNajblizszegoMiasta.From], slownikMiast[drogaDoNajblizszegoMiasta.To], drogaDoNajblizszegoMiasta.HowLong); }while (odwiedzoneMiasta.Count < tabelaMiast.GetLength(0)); Console.WriteLine("Powrót z {0} do {1} to odległośc {2} km.", slownikMiast[odwiedzoneMiasta.Last()], slownikMiast[miastoZktoregoStartuje], tabelaMiast[miastoZktoregoStartuje, odwiedzoneMiasta.Last()]); }