Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.59 KB | None | 0 0
  1. sing System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. // Zaimplementuj algorytm Prima zgodnie z opisem podanym na wykładzie.
  8.  
  9. namespace Zadanie5
  10. {
  11. // implementacja grafu jako macierzy sąsiedztwa
  12. // klasa implementuje algorytm Prima
  13. class Prim
  14. {
  15. int[,] graphTable;
  16. public Prim(int[,] graphTable)
  17. {
  18. this.graphTable = graphTable;
  19. }
  20.  
  21. // zwraca liczbę wierzchołków
  22. public int getN()
  23. {
  24. return graphTable.GetLength(0);
  25. }
  26.  
  27. //właściwy algorytm
  28. public List<int> MinSpanningTree()
  29. {
  30. int n = getN();
  31. // jeśli true, wierzchołek odpowiadający danemu indeksowi został już umieszczony
  32. // w drzewie
  33. bool[] mstSet = new bool[n];
  34. int[] wages = new int[n];
  35. // potrzebny do wygenerowania początkowego wierzchołka
  36. Random generator = new Random();
  37. // lista wierzchołków w kolejności dodawania ich do drzewa
  38. List<int> result = new List<int>();
  39.  
  40. int firstVertex = generator.Next(n);
  41. for (int i = 0; i < n; i++)
  42. {
  43. wages[i] = int.MaxValue;
  44. }
  45. wages[firstVertex] = 0;
  46.  
  47. for (int i = 0; i < n - 1; i++)
  48. {
  49. int min = int.MaxValue;
  50. int minIndex = -1;
  51. // pętla znajduje wierzchołek, którego odległość(waga) od drzewa jest najmniejsza
  52. for (int j = 0; j < n; j++)
  53. {
  54. if (mstSet[j] == false && wages[j] < min)
  55. {
  56. min = wages[j];
  57. minIndex = j;
  58. }
  59. }
  60. // umieść wierzchołek w drzewie
  61. mstSet[minIndex] = true;
  62. // i dodaj do listy rezultatów
  63. result.Add(minIndex);
  64. // aktualizacja tablicy wag
  65. for (int j = 0; j < n; j++)
  66. {
  67. if (graphTable[minIndex, j] != 0 && mstSet[j] == false && graphTable[minIndex, j] < wages[j])
  68. wages[j] = graphTable[minIndex, j];
  69. }
  70. }
  71. return result;
  72. }
  73. }
  74. }
  75.  
  76.  
  77. /////////////////////// DIJKSTRA
  78. using System;
  79. using System.Collections.Generic;
  80. using System.Linq;
  81. using System.Text;
  82. using System.Threading.Tasks;
  83.  
  84. // Zaimplementuj algorytm Dijkstry zgodnie z pseudokodem podanym na wykładzie.
  85.  
  86. namespace Zadanie3
  87. {
  88. // implementacja grafu jako macierzy sąsiedztwa
  89. class Graph
  90. {
  91. int[,] graphTable;
  92. public Graph(int[,] table)
  93. {
  94. graphTable = table;
  95. }
  96.  
  97. // zwraca liczbę wierzchołków
  98. public int getN()
  99. {
  100. return graphTable.GetLength(0);
  101. }
  102.  
  103. // Algorytm Dijkstry
  104. // source jest wierzchołkiem odniesienia
  105. public void Dijkstra(int source)
  106. {
  107. int n = getN();
  108. int[] wages = new int[n];
  109. bool[] sptSet = new bool[n];
  110. // sptSet = true, wtedy gdy dla odpowiadającemu mu wierzchołkowi zostały już obliczone wagi najkrótszych ścieżek
  111. // najpierw wypełnij tablicę wartościami maksymalnymi:
  112. for (int i = 0; i < wages.Length; i++)
  113. {
  114. wages[i] = int.MaxValue;
  115. }
  116. // odległość wierzchołka source od jego samego równa się 0
  117. wages[source] = 0;
  118. int min = int.MaxValue;
  119. for (int k = 0; k < n - 1; k++)
  120. {
  121. // szukanie wartości min spośród nieznaczonych wartością true wag oraz indeksu tej wartości
  122. min = int.MaxValue;
  123. int minIndex = -1;
  124. for (int i = 0; i < wages.Length; i++)
  125. {
  126. if (!sptSet[i] && wages[i] < min)
  127. {
  128. min = wages[i];
  129. minIndex = i;
  130. }
  131. }
  132. sptSet[minIndex] = true;
  133. // dla tego wierzchołka oblicz wagi, jeśli nie zostały jeszcze obliczone (pierwszy warunek), jeśli nie ma połączenia z
  134. // danym wierzchołkiem (drugi warunek) i jeśli suma min i odległości wierzchołków minIndex oraz 'i' od siebie jest mniejsza
  135. // od wartości już się znajdującej w tablicy
  136. for (int i = 0; i < wages.Length; i++)
  137. {
  138. if (!sptSet[i] && graphTable[minIndex, i] != 0 && min + graphTable[minIndex, i] < wages[i])
  139. {
  140. wages[i] = min + graphTable[minIndex, i];
  141. }
  142. }
  143. }
  144. Console.WriteLine("Wierzchołek\tOdległość");
  145. for (int i = 0; i < wages.Length; i++)
  146. {
  147. Console.WriteLine(i + "\t" + wages[i]);
  148. }
  149. }
  150. }
  151. }
  152.  
  153. /////// prim dla najwiekszych
  154.  
  155. public List<int> MaxSpanningTree()
  156. {
  157. int n = graphTable.GetLength(0);
  158. Random generator = new Random();
  159. bool[] mstSet = new bool[n];
  160. int[] wages = new int[n];
  161. List<int> result = new List<int>();
  162.  
  163. for (int i = 0; i < wages.Length; i++) // INICJALIZACJA
  164. {
  165. wages[i] = int.MinValue;
  166. }
  167. int firstVertex = generator.Next(n);
  168. wages[firstVertex] = 0; // geenerowanie vertex
  169. for (int i = 0; i < n; i++) // big petla
  170. {
  171. int max = -1; // cos jak u ale nie u
  172. int maxIndex = -1;
  173. for (int j = 0; j < n; j++)
  174. {
  175. if (!mstSet[j] && max < wages[j]) // sprawdzamy z ansza tablica bool
  176. {
  177. max = wages[j];
  178. maxIndex = j;
  179. }
  180. }
  181. mstSet[maxIndex] = true;
  182. result.Add(maxIndex);
  183. for (int j = 0; j < n; j++)
  184. {
  185. if (!mstSet[j] && graphTable[maxIndex, j] != 0 && graphTable[maxIndex, j] + max > wages[j])
  186. wages[j] = graphTable[maxIndex, j] + max;
  187. }
  188. }
  189. return result;
  190. }
  191. }
  192. static void Main(string[] args)
  193. {
  194. int[,] wages =
  195. {
  196. {0, 4, 0, 0, 0, 0, 0, 8, 0 },
  197. {4, 0, 8, 0, 0, 0, 0, 11, 0 },
  198. {0, 8, 0, 7, 0, 4, 0, 0, 2 },
  199. {0, 0, 7, 0, 9, 14, 0, 0, 0 },
  200. {0, 0, 0, 9, 0, 10, 0, 0, 0 },
  201. {0, 0, 4, 14, 10, 0, 2, 0, 0 },
  202. {0, 0, 0, 0, 0, 2, 0, 1, 6 },
  203. {8, 11, 0, 0, 0, 0, 1, 0, 7 },
  204. {0, 0, 2, 0, 0, 0, 6, 7, 0 }
  205. };
  206. // graf ze strony: http://www.geeksforgeeks.org/greedy-algorithms-set-5-prims-minimum-spanning-tree-mst-2/
  207. Graph G = new Graph(wages);
  208. List<int> maxSpanningTree = G.MaxSpanningTree();
  209. foreach (var item in maxSpanningTree)
  210. {
  211. Console.Write(item + " ");
  212. }
  213. Console.ReadLine();
  214. }
  215. }
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement