ChameL1oN

Краскал

Mar 26th, 2015
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <locale>
  4.  
  5. using namespace std;
  6. struct edge
  7. {
  8. int u, v, w;
  9. };
  10. edge *e;
  11. int* p;
  12. int* b;
  13. void qsort(int l, int r)
  14. {
  15. int i = l; int j = r;
  16. int mid = e[(i + j) / 2].w;
  17. do
  18. {
  19. while (e[i].w<mid) i++;
  20. while (e[j].w>mid) j--;
  21. if (i <= j)
  22. {
  23. edge buf = e[i];
  24. e[i] = e[j];
  25. e[j] = buf;
  26. i++;
  27. j--;
  28. }
  29. } while (i <= j);
  30. if (i<r) qsort(i, r);
  31. if (j>l) qsort(l, j);
  32.  
  33. }
  34. int findset(int x)
  35. {
  36. if (x != p[x]) p[x] = findset(p[x]);
  37. return p[x];
  38. }
  39. void un(int x, int y)
  40. {
  41. x = findset(x); y = findset(y);
  42. if (b[x]>b[y]) p[y] = x; else p[x] = y;
  43. if (b[x] == b[y]) b[y]++;
  44. }
  45. int main()
  46. {
  47. int d, i, j, q = 0;
  48.  
  49. ifstream f("ishod.txt", ios::in);
  50. ofstream F("EdgeTemp.txt");
  51.  
  52. f >> d;
  53. int** massive = new int*[d];
  54. for (i = 0; i < d; i++){
  55. massive[i] = new int[d];
  56. }
  57. for (i = 0; i < d; i++){ //Считывание матрицы
  58. for (j = 0; j < d; j++){
  59. string s;
  60. f >> s;
  61. if (s == "~") massive[i][j] = -1;
  62. else massive[i][j] = atoi(s.c_str());
  63. }
  64. }
  65. for (i = 0; i < d; i++){ // Счёт кол-ва рёбер в графе
  66. for (j = i + 1; j < d; j++){
  67. if (massive[i][j] != -1){
  68. q++;
  69. }
  70. }
  71. }
  72. f.close();
  73. F << d << " " << q << endl; // d - вершины , q - рёбра
  74. F.close();
  75. F.open("EdgeTemp.txt", ios::app);
  76. for (i = 0; i < d; i++){
  77. for (j = i + 1; j < d; j++){
  78. if (massive[i][j] != -1){
  79. F << i + 1 << " " << j + 1 << " " << massive[i][j] << endl; //Запись в файл в виде (точка1,точка2,длина)
  80. }
  81. }
  82. }
  83. F.close();
  84.  
  85. ifstream f("EdgeTemp.txt", ios::in);
  86.  
  87. setlocale(LC_ALL, "RUS");
  88. int m, n;
  89. cout<<"Введите кол-во вершин в графе\n";
  90. f>>m;
  91. e = new edge[m];
  92. cout<<"Введите кол-во ребер в графе\n";
  93. f>>n;
  94. p = new int[n];
  95. b = new int[n];
  96. for (int i = 0; i<m; i++) //Заполняем массив ребёр
  97. {
  98. f>>e[i].u;
  99. f>>e[i].v;
  100. f>>e[i].w;
  101. }
  102. qsort(0, m - 1); // Сортировка
  103. for (int i = 0; i<n; i++)
  104. {
  105. p[i] = i;
  106. b[i] = 0;
  107. }
  108. for (int i = 0; i<m; i++)
  109. if (findset(e[i].u) != findset(e[i].v)) //Проверка на связность
  110. {
  111. un(e[i].u, e[i].v);
  112. cout<<e[i].u<<" "<<e[i].v<<" ";
  113. }
  114. return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment