Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Dijkstra
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. int INF = Dijkstra.INF;
  14. int[,] graph = new int[,]{
  15. {INF, 1, INF, INF, 6},
  16. { 4, INF, 1, INF, 8},
  17. {INF, INF, INF, 2, INF},
  18. {INF, INF, INF, INF, 1},
  19. {INF, 5, INF, INF, INF}};
  20.  
  21. var dijkstra = new Dijkstra(graph);
  22. int[,] ścieżki = {
  23. { 1, 4 },
  24. { 3, 0 },
  25. { 0, 2 },
  26. { 2, 3 }
  27. };
  28. for (int i = 0; i < ścieżki.GetLength(0); i++)
  29. {
  30. int src = ścieżki[i, 0],
  31. dest = ścieżki[i, 1];
  32. string path = ŚcieżkaDoStringa(dijkstra.PobierzŚcieżkę(src, dest));
  33. Console.WriteLine("Ścieżka {0} - {1}: {2}", src, dest, path);
  34. }
  35. Console.ReadKey();
  36. }
  37.  
  38.  
  39. private static string ŚcieżkaDoStringa(int[] route)
  40. {
  41. if (route != null)
  42. return String.Join(" => ", route);
  43. else
  44. return "Brak";
  45. }
  46. }
  47.  
  48. public class Dijkstra
  49. {
  50. public const int INF = 1000000;
  51. public int[,] Graph { get; set; }
  52. public Dijkstra(int[,] graph)
  53. {
  54. Graph = graph;
  55. }
  56.  
  57. public int[] PobierzŚcieżkę(int SRC, int DEST)
  58. {
  59. int rozmiarGrafu = Graph.GetLength(0);
  60. int[] dist = new int[rozmiarGrafu];
  61. int[] prev = new int[rozmiarGrafu];
  62. int[] nodes = new int[rozmiarGrafu];
  63.  
  64. for (int i = 0; i < dist.Length; i++)
  65. {
  66. dist[i] = prev[i] = INF;
  67. nodes[i] = i;
  68. }
  69.  
  70. dist[SRC] = 0;
  71. do
  72. {
  73. int smallest = nodes[0];
  74. int smallestIndex = 0;
  75. for (int i = 1; i < rozmiarGrafu; i++)
  76. {
  77. if (dist[nodes[i]] < dist[smallest])
  78. {
  79. smallest = nodes[i];
  80. smallestIndex = i;
  81. }
  82. }
  83. rozmiarGrafu--;
  84. nodes[smallestIndex] = nodes[rozmiarGrafu];
  85.  
  86. if (dist[smallest] == INF || smallest == DEST)
  87. break;
  88.  
  89. for (int i = 0; i < rozmiarGrafu; i++)
  90. {
  91. int v = nodes[i];
  92. int newDist = dist[smallest] + Graph[smallest, v];
  93. if (newDist < dist[v])
  94. {
  95. dist[v] = newDist;
  96. prev[v] = smallest;
  97. }
  98. }
  99. } while (rozmiarGrafu > 0);
  100. return odtwórzŚcieżkę(prev, SRC, DEST);
  101. }
  102.  
  103. public int[] odtwórzŚcieżkę(int[] prev, int SRC, int DEST)
  104. {
  105. int[] ret = new int[prev.Length];
  106. int currentNode = 0;
  107. ret[currentNode] = DEST;
  108. while (ret[currentNode] != INF && ret[currentNode] != SRC)
  109. {
  110. ret[currentNode + 1] = prev[ret[currentNode]];
  111. currentNode++;
  112. }
  113. if (ret[currentNode] != SRC)
  114. return null;
  115. int[] reversed = new int[currentNode + 1];
  116. for (int i = currentNode; i >= 0; i--)
  117. reversed[currentNode - i] = ret[i];
  118. return reversed;
  119. }
  120. }
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement