Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.51 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6.  
  7. namespace PS1
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. #region read from file
  14. var filePath = @"C:\Users\Maciek\Desktop\mgr\algorytmy\PS1\in5.txt";
  15. var lines = File.ReadAllLines(filePath);
  16. //n - wierzchołki m-krawedzi
  17. var line = lines[0].Split(' ');
  18. var n = int.Parse(line[0]);
  19. var m = int.Parse(line[1]);
  20. var cords = new Dictionary<int, (int, int)>();
  21. var h = new Dictionary<int, int>();
  22. var graph = new Dictionary<int, List<int>>();
  23. var weights = new Dictionary<(int, int), int>();
  24. int padding = 0;
  25. for (int i = 1; i <= n; i++)
  26. {
  27. graph.Add(i, new List<int>());
  28. }
  29. if (filePath.Contains("in5"))
  30. {
  31. for (int i = 1; i <= n; i++)
  32. {
  33. line = lines[i].Split(' ');
  34. cords.Add(i, (int.Parse(line[0]), int.Parse(line[1])));
  35. }
  36. padding = n;
  37. }
  38.  
  39. for (int i = 1; i <= m; i++)
  40. {
  41. line = lines[i + padding].Split(' ');
  42.  
  43. graph[int.Parse(line[0])].Add(int.Parse(line[1]));
  44. graph[int.Parse(line[1])].Add(int.Parse(line[0]));
  45. weights.Add((int.Parse(line[0]), int.Parse(line[1])), int.Parse(line[2]));
  46. weights.Add((int.Parse(line[1]), int.Parse(line[0])), int.Parse(line[2]));
  47. }
  48. line = lines[m + padding + 1].Split(' ');
  49. var begin = int.Parse(line[0]);
  50. var end = int.Parse(line[1]);
  51. if (filePath.Contains("in5"))
  52. {
  53. var endCord = cords[end];
  54.  
  55. for (int i = 1; i <= n; i++)
  56. {
  57. h.Add(i, CalculateH(cords[i], endCord) );
  58. }
  59. Console.WriteLine(h[end]);
  60.  
  61.  
  62. AStar(graph, weights, n, m, begin, end, h);
  63. }
  64.  
  65. #endregion read from file
  66.  
  67. //Bfs(graph, weights, n, m, begin, end);
  68. Dijkstra(graph, weights, n, m, begin, end);
  69.  
  70. }
  71.  
  72. private static int CalculateH((int,int) node1, (int,int) node2)
  73. {
  74. var xPow = Math.Pow(node1.Item1 - node2.Item1, 2);
  75. var yPow = Math.Pow(node1.Item2 - node2.Item2, 2);
  76.  
  77. return (int)Math.Sqrt(xPow + yPow);
  78.  
  79. }
  80.  
  81. public static void Bfs(Dictionary<int, List<int>> graph, Dictionary<(int, int), int> weights, int n, int m, int begin, int end)
  82. {
  83.  
  84. var visited = new Dictionary<int,int>();
  85. var d = new int[n + 1];
  86. var previous = new int[n + 1];
  87. var calculated = new bool[n + 1];
  88.  
  89. for (int i = 1; i <= n; i++)
  90. {
  91. visited[i] = int.MaxValue;
  92. d[i] = int.MaxValue;
  93. calculated[i] = false;
  94.  
  95. }
  96. var queue = new Queue<int>();
  97.  
  98. visited[begin] = 0;
  99. d[begin] = 0;
  100. queue.Enqueue(begin);
  101.  
  102. var stopWatch = Stopwatch.StartNew();
  103. while (queue.Count > 0)
  104. {
  105. var v = queue.Dequeue();
  106. if (v == end)
  107. {
  108. break;
  109. }
  110. foreach (var item in graph[v])
  111. {
  112. if (!calculated [item] && d[item] > d[v] && visited[item] > visited[v] + weights[(v,item)])
  113. {
  114. if (visited[item] == int.MaxValue)
  115. {
  116. queue.Enqueue(item);
  117. }
  118. previous[item] = v;
  119. d[item] = d[v] + 1;
  120. visited[item] = visited[v] + weights[(v, item)];
  121. }
  122. }
  123. calculated[v] = true;
  124. }
  125. stopWatch.Stop();
  126. Console.WriteLine(stopWatch.ElapsedMilliseconds + "ms");
  127. int current = end;
  128. var result = new Stack<int>();
  129. while (current != begin)
  130. {
  131. result.Push(current);
  132. current = previous[current];
  133. }
  134. result.Push(current);
  135. var length = result.Count();
  136. Console.WriteLine($"{length-2} {visited[end]}");
  137. for (int i = 0; i < length; i++)
  138. {
  139. Console.Write($"{result.Pop()} ");
  140. }
  141.  
  142. }
  143. public static void Dijkstra(Dictionary<int, List<int>> graph, Dictionary<(int, int), int> weights, int n, int m, int begin, int end)
  144. {
  145. var visited = new Dictionary<int, bool>();
  146. var d = new int[n + 1];
  147. var previous = new int[n + 1];
  148. int v;
  149. for (int i = 1; i <= n; i++)
  150. {
  151. visited[i] = false;
  152. d[i] = int.MaxValue;
  153. }
  154.  
  155. var start = new int[] { begin };
  156. d[begin] = 0;
  157. var sortedSet = new SortedSet<int>(start, new Comparer(d));
  158.  
  159. var stopWatch = Stopwatch.StartNew();
  160. while (sortedSet.Count > 0)
  161. {
  162. v = sortedSet.First();
  163. sortedSet.Remove(v);
  164. visited[v] = true;
  165.  
  166. if (v == end)
  167. {
  168. break;
  169. }
  170. foreach (var item in graph[v])
  171. {
  172. if (!visited[item] && d[v] + weights[(v, item)] < d[item])
  173. {
  174. sortedSet.Remove(item);
  175. d[item] = d[v] + weights[(v, item)];
  176. sortedSet.Add(item);
  177. previous[item] = v;
  178. }
  179. }
  180. }
  181. stopWatch.Stop();
  182.  
  183. Console.WriteLine(stopWatch.ElapsedMilliseconds + "ms");
  184.  
  185. int current = end;
  186. var result = new Stack<int>();
  187. while (current != begin)
  188. {
  189. result.Push(current);
  190. current = previous[current];
  191. }
  192. result.Push(current);
  193. var length = result.Count();
  194. Console.WriteLine($"{d[end]}");
  195. for (int i = 0; i < length; i++)
  196. {
  197. Console.Write($"{result.Pop()} ");
  198. }
  199. Console.WriteLine();
  200. }
  201.  
  202. public static void AStar(Dictionary<int, List<int>> graph, Dictionary<(int, int), int> weights, int n, int m, int begin, int end, Dictionary<int,int> h)
  203. {
  204. var visited = new Dictionary<int, bool>();
  205. var d = new int[n + 1];
  206. var previous = new int[n + 1];
  207. int v;
  208. var f = new int[n + 1];
  209. for (int i = 1; i <= n; i++)
  210. {
  211. visited[i] = false;
  212. d[i] = int.MaxValue;
  213. }
  214.  
  215. var start = new int[] { begin };
  216. d[begin] = 0;
  217. f[begin] = 0 + h[begin];
  218. var sortedSet = new SortedSet<int>(start, new Comparer(f));
  219.  
  220. var stopWatch = Stopwatch.StartNew();
  221. while (sortedSet.Count > 0)
  222. {
  223. v = sortedSet.First();
  224. sortedSet.Remove(v);
  225.  
  226. visited[v] = true;
  227.  
  228. if (v == end)
  229. {
  230. break;
  231. }
  232. foreach (var item in graph[v])
  233. {
  234.  
  235. if (!visited[item] && d[v] + weights[(v, item)] < d[item])
  236. {
  237. sortedSet.Remove(item);
  238. d[item] = d[v] + weights[(v, item)];
  239. f[item] = d[item] + h[item];
  240. sortedSet.Add(item);
  241. previous[item] = v;
  242. }
  243. }
  244. }
  245. stopWatch.Stop();
  246.  
  247. Console.WriteLine(stopWatch.ElapsedMilliseconds + "ms");
  248.  
  249. int current = end;
  250. var result = new Stack<int>();
  251. int sum = 0;
  252. while (current != begin)
  253. {
  254. result.Push(current);
  255. sum += weights[(current, previous[current])];
  256. current = previous[current];
  257.  
  258. }
  259. result.Push(current);
  260. var length = result.Count();
  261. Console.WriteLine($"{sum}");
  262. for (int i = 0; i < length; i++)
  263. {
  264. Console.Write($"{result.Pop()} ");
  265. }
  266. Console.WriteLine();
  267. }
  268.  
  269.  
  270. }
  271. }
  272. //////////////////////////////////////////////////////////////klasa do comparatora
  273. using System;
  274. using System.Collections.Generic;
  275. using System.Diagnostics.CodeAnalysis;
  276. using System.Text;
  277.  
  278. namespace PS1
  279. {
  280. public class Comparer : IComparer<int>
  281. {
  282. public int[] dist { get; set; }
  283. public Comparer(int[] dist)
  284. {
  285. this.dist = dist;
  286. }
  287. public int Compare(int x, int y)
  288. {
  289. var compare = dist[x].CompareTo(dist[y]);
  290. if (compare == 0)
  291. {
  292. return x.CompareTo(y);
  293. }
  294. return compare;
  295. }
  296. }
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement