Advertisement
Guest User

Untitled

a guest
Jul 1st, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.48 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <fstream>
  4. #include <locale>
  5.  
  6. using namespace std;
  7.  
  8. class Task
  9. {
  10. public:
  11. int n, m;
  12. int x, y, w;
  13. int **Graph;
  14. int Initial_Vertex, Max;
  15. int *Way;
  16. int **Span;
  17. int Sum;
  18.  
  19. public: Task(){};
  20.  
  21. public: void ReadData(char *s)
  22. {
  23. ifstream f;
  24. f.open(s);
  25. if (f.fail()) cout << "Ошибка чтения файла" << endl;
  26. f >> n;
  27. Graph = new int*[n];
  28. for (int i = 0; i < n; i++)
  29. {
  30. Graph[i] = new int[n];
  31. }
  32. for (int i = 0; i < n; i++)
  33. {
  34. for (int j = 0; j < n; j++)
  35. {
  36. Graph[i][j] = 0;
  37. }
  38. }
  39. f >> m;
  40. for (int i = 0; i < m; i++)
  41. {
  42. f >> x >> y >> w;
  43. Graph[x][y] = w;
  44. Graph[y][x] = Graph[x][y];
  45. }
  46. f >> Max;
  47. cout << "Матрица смежности графа" << endl;
  48. for (int i = 0; i < n; i++)
  49. {
  50. for (int j = 0; j < n; j++)
  51. {
  52. cout << Graph[i][j] << " ";
  53. if (Graph[i][j] == 0) Graph[i][j] = Max;
  54. }
  55. cout << "\n";
  56. }
  57. f >> Initial_Vertex;
  58. f.close();
  59. }
  60. public: void WriteData(char *s, int **Span, int *Way, int Sum)
  61. {
  62. ofstream f;
  63. f.open(s);
  64. if (f.fail()) cout << "Ошибка записи файла" << endl;
  65. f << n << endl;
  66. f << n - 1 << endl;
  67. for (int i = 0; i < n; i++)
  68. for (int j = 0; j < n; j++)
  69. {
  70. if (Span[i][j] != 0 && i < j)
  71. f << i << " " << j << " " << Span[i][j] << endl;
  72. }
  73. for (int i = 0; i < n; i++)
  74. f << Way[i] << endl;
  75. f << Sum;
  76. f.close();
  77. }
  78. };
  79.  
  80. class AlgorithmPrima
  81. {
  82. public:
  83. Task data;
  84. int Count;
  85. int Min;
  86. int x, y;
  87. bool *Visited;
  88.  
  89. public: AlgorithmPrima(){};
  90.  
  91. public: void Algorithm()
  92. {
  93. data.ReadData("D:\\Prima\\input.txt");
  94. MST(data.n, data.Graph, data.Initial_Vertex, data.Max);
  95. data.WriteData("D:\\Prima\\output.txt", data.Span, data.Way, data.Sum);
  96. }
  97.  
  98. void MST(int n, int **Graph, int Vertex, int Max)
  99. {
  100. Visited = new bool[n];
  101. for (int i = 0; i < n; i++)
  102. Visited[i] = false;
  103. data.Way = new int[n];
  104. for (int i = 0; i < n; i++)
  105. data.Way[n] = 0;
  106. data.Span = new int*[n];
  107. for (int i = 0; i < n; i++)
  108. data.Span[i] = new int[n];
  109. for (int i = 0; i < n; i++)
  110. for (int j = 0; j < n; j++)
  111. data.Span[i][j] = 0;
  112. time_t start = time(NULL);
  113. Count = 0;
  114. data.Sum = 0;
  115. Visited[Vertex] = true;
  116. data.Way[0] = Vertex;
  117. while (Count < n - 1)
  118. {
  119. Min = Max;
  120. for (int k = 0; k <= Count; k++)
  121. for (int j = 0; j < n; j++)
  122. if ((Graph[data.Way[k]][j] < Min) && (Visited[j] == false))
  123. {
  124. Min = Graph[data.Way[k]][j];
  125. y = data.Way[k];
  126. x = j;
  127. }
  128. Count = Count + 1;
  129. data.Way[Count] = x;
  130. Visited[x] = true;
  131. Graph[x][y] = 0;
  132. data.Span[x][y] = Min;
  133. Graph[y][x] = 0;
  134. data.Span[y][x] = Min;
  135. data.Sum = data.Sum + Min;
  136. }
  137. time_t finish = time(NULL);
  138. Print(n, data.Span, data.Way, data.Sum, finish-start);
  139. }
  140.  
  141. void Print(int n, int **Span, int *Way, int Sum, time_t Time)
  142. {
  143. cout << "\nМатрица смежности остова\n";
  144. for (int i = 0; i < n; i++)
  145. {
  146. for (int j = 0; j < n; j++)
  147. {
  148. cout << Span[i][j] << " ";
  149. }
  150. cout << "\n";
  151. }
  152. cout << "\nМаршрут: ";
  153. for (int i = 0; i < n; i++)
  154. {
  155. cout << Way[i];
  156. if (i < n - 1) cout << " --> ";
  157. }
  158. cout << endl;
  159. cout << "\nМинимальная стоимость пути: " << Sum << endl;
  160. cout << "\nВремя выполнения алгоритма: " << Time << " сек. " << endl;
  161. }
  162. };
  163.  
  164. int _tmain(int argc, _TCHAR* argv[])
  165. {
  166. setlocale(LC_ALL, "RUS");
  167. AlgorithmPrima a;
  168. a.Algorithm();
  169. system("pause");
  170. return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement