Advertisement
Guest User

Untitled

a guest
Jan 21st, 2020
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.83 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5.  
  6. namespace ConsoleApp2
  7. {
  8. struct Krawedz
  9. {
  10. public int u;
  11. public int v;
  12. public int priorytet;
  13. }
  14. class PriorityQueue
  15. {
  16. public List<Krawedz> kopiec;
  17. public PriorityQueue()
  18. {
  19. kopiec = new List<Krawedz>();
  20. }
  21. public void Dodaj(Krawedz x)
  22. {
  23. kopiec.Add(x);
  24. int syn = kopiec.Count - 1; //syn - ostatni element w tablicy = x
  25.  
  26. while (syn > 0)
  27. {
  28. int rodzic = (syn - 1) / 2;
  29. if (kopiec[rodzic].priorytet <= x.priorytet) break; // jeśli rodzic ma mniejszy priorytet od x
  30. // przerywamy - kopiec jest dobrze utowrzony
  31.  
  32. kopiec[syn] = kopiec[rodzic]; // jeśli nie przywracamy strukturę kopca
  33. syn = rodzic;
  34. }
  35.  
  36. if (kopiec.Count > 0) kopiec[syn] = x; //znaleźliśmy miejsc x w kopcu
  37. }
  38.  
  39. public void Wypisz()
  40. {
  41. foreach (Krawedz i in kopiec)
  42. {
  43. Console.WriteLine("Krawedzie: " + i.u + "-" + i.v + " Waga: " + i.priorytet);
  44. }
  45. }
  46. public void Zdejmij()
  47. {
  48.  
  49. Krawedz liść = kopiec[kopiec.Count - 1];
  50. kopiec.RemoveAt(kopiec.Count - 1);
  51.  
  52. int i = 0;
  53. while (i * 2 + 1 < kopiec.Count)
  54. {
  55. int syn1 = i * 2 + 1;
  56. int syn2 = i * 2 + 2;
  57. int rodzic = syn2 < kopiec.Count && kopiec[syn2].priorytet < kopiec[syn1].priorytet ? syn2 : syn1;
  58. //indeks rodzic wskazuje na jego mniejszego syna
  59.  
  60. if (kopiec[rodzic].priorytet >= liść.priorytet) break;
  61. kopiec[i] = kopiec[rodzic];
  62. i = rodzic;
  63. }
  64.  
  65. if (kopiec.Count > 0) kopiec[i] = liść;
  66. }
  67.  
  68. public Krawedz Korzen()
  69. {
  70. if (kopiec.Count == 0) throw new InvalidOperationException("Queue is empty.");
  71. return kopiec[0];
  72. }
  73.  
  74. public int Ilosc()
  75. {
  76. return kopiec.Count;
  77. }
  78. public void Clear()
  79. {
  80. kopiec.Clear();
  81. }
  82. }
  83. class Program
  84. {
  85. static void Main(string[] args)
  86. {
  87. PriorityQueue kolejka = new PriorityQueue();
  88. string[] line = System.IO.File.ReadAllLines("in.txt");
  89. string[] k = line[0].Split(' ');
  90. int licznik = 0;
  91. int n = int.Parse(k[0]); //ilość urządzeń sieciowych ( <= 1000 )
  92. int m = int.Parse(k[1]); //ilość wszystkich dostępnych połączeń między urządzeniami ( <= 1 000 000 )
  93. Krawedz[] krawedzie = new Krawedz[n - 1]; //tablica przechowująca gałęzie drzewa rozpinającego
  94. List<int> drzewo = new List<int>();
  95. int[,] macierz = new int[n + 1, n + 1]; //macierz wag, sąsiedztwa (0 oznacza, że nie jest sąsiadem)
  96. bool[] odwiedzone = new bool[n + 1]; //czy odwiedzono i-ty wierzchołek
  97. List<int>[] lista = new List<int>[n + 1]; //listy incydencji
  98. for (int i = 0; i <= n; i++)
  99. {
  100. lista[i] = new List<int>(); // tworzenie tablic
  101. }
  102. for (int i = 1; i <= n; i++)
  103. {
  104. odwiedzone[i] = false;
  105. }
  106. for (int i = 1; i <= m; i++)
  107. {
  108. k = line[i].Split(' ');
  109. lista[int.Parse(k[0])].Add(int.Parse(k[1]));
  110. lista[int.Parse(k[1])].Add(int.Parse(k[0]));
  111. macierz[int.Parse(k[0]), int.Parse(k[1])] = int.Parse(k[2]);
  112. macierz[int.Parse(k[1]), int.Parse(k[0])] = int.Parse(k[2]);
  113. }
  114. float suma = 0;
  115. int pom = 1;
  116. float p;
  117. int l = 0;
  118. int v = 1; //wierzchołek startowy
  119. odwiedzone[1] = true;
  120. for (int i = 0; i <= n - 2; i++)
  121. {
  122. foreach (int u in lista[v]) //dla kazdego sasiada wirzcholka v
  123. {
  124. licznik++;
  125. if (odwiedzone[u] == false) // jesli nie odwiedzilismy go
  126. {
  127. Krawedz wch = new Krawedz();
  128. wch.u = u;
  129. wch.v = v;
  130. wch.priorytet = macierz[v, u];
  131. kolejka.Dodaj(wch); //dodajemy krawedz do kolejki priorytetowej
  132. }
  133. }
  134. while (kolejka.Ilosc() != 0) //dopoki kolejka niepusta
  135. {
  136. licznik++;
  137. Krawedz w = new Krawedz();
  138. w = kolejka.Korzen();
  139. p = w.priorytet;
  140. kolejka.Zdejmij();
  141. if (odwiedzone[w.u] == false)
  142. {
  143. suma += p;
  144. krawedzie[l] = w;
  145. l++;
  146. odwiedzone[w.u] = true;
  147. pom = w.u;
  148. break;
  149. }
  150.  
  151. }
  152. v = pom;
  153. }
  154. Console.WriteLine("Koszt: " + suma);
  155. StreamWriter sw = new StreamWriter("out.txt");
  156. sw.WriteLine(suma);
  157. Console.WriteLine("Krawedzie: ");
  158. foreach (Krawedz i in krawedzie)
  159. {
  160. Console.WriteLine(i.u + " - " + i.v + " waga: " + i.priorytet);
  161.  
  162. }
  163.  
  164. //Wypisanie jakie wierzchołki zostały odwiedzone, potwierdzenie działania programu
  165. foreach (Krawedz i in krawedzie)
  166. {
  167. drzewo.Add(i.v);
  168. drzewo.Add(i.u);
  169. }
  170. drzewo.Sort();
  171. foreach(int i in drzewo)
  172. {
  173. Console.WriteLine(i);
  174. }
  175.  
  176. //przegladanie grafu wszerz BFS
  177. //startowy wierzcholek = 1
  178. List<int> wynik = new List<int>();
  179. Queue<int> bfs = new Queue<int>();
  180. List<int>[] lista_bfs = new List<int>[n + 1]; //listy incydencji
  181. bool[] odwiedzone_bfs = new bool[n + 1]; //czy odwiedzono i-ty wierzchołek
  182. for (int i = 0; i <= n; i++)
  183. {
  184. lista_bfs[i] = new List<int>(); // tworzenie tablic
  185. }
  186. for (int i = 1; i <= n; i++)
  187. {
  188. odwiedzone_bfs[i] = false;
  189. }
  190. foreach (Krawedz i in krawedzie)
  191. {
  192. Console.WriteLine(i.v + " " + i.u);
  193. lista_bfs[i.v].Add(i.u);
  194. lista_bfs[i.u].Add(i.v);
  195. }
  196. odwiedzone_bfs[1] = true;
  197. bfs.Enqueue(1);
  198. int wierzcholek;
  199. while(bfs.Count != 0)
  200. {
  201. wierzcholek = bfs.First();
  202. wynik.Add(wierzcholek);
  203. bfs.Dequeue();
  204. foreach (int u in lista_bfs[wierzcholek]) //dla kazdego sasiada wirzcholka wierzcholek
  205. {
  206. if (odwiedzone_bfs[u] == false) // jesli nie odwiedzilismy go
  207. {
  208. bfs.Enqueue(u);
  209. odwiedzone_bfs[u] = true;
  210. }
  211. }
  212.  
  213. }
  214. Console.WriteLine("Wierzchołki zostałe odwiedzone w kolejności: ");
  215. foreach (int i in wynik)
  216. {
  217. Console.WriteLine(i);
  218. }
  219.  
  220. //
  221. Console.WriteLine("Licznik: " + licznik);
  222. sw.Close();
  223. Console.ReadKey();
  224. }
  225. }
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement