Advertisement
Marisichka

Untitled

Nov 16th, 2021
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.04 KB | None | 0 0
  1. #include <ctime>
  2. #include <iostream>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. unsigned long long compare = 0, assign = 0; // оепратор сравнения и присваивания
  8.  
  9. #define Infinity 1000000
  10. #define in_file "input.txt"
  11. #define _x 0
  12. #define _y 1
  13. #define _z 2
  14.  
  15. class graph {
  16. private:
  17.  
  18.     int** G; // таблица смежности графа
  19.     int** T; // остовное дерево
  20.     int* parent; // массив кластеров
  21.     int V, R; // кол-во вершин и ребёр
  22.  
  23. public:
  24.     void union_set(int r, int v); // функция создания кластеров
  25.     int find_set(int i); // функция для нахождения нужных вершин
  26.     void kraskal(); // алгоритм Краскала
  27.     void prima(); // алгоритм Прима
  28.  
  29.     graph(string file) {
  30.         ifstream in(file);
  31.         if (in.is_open()) {
  32.             in >> V;
  33.             in >> R;
  34.             G = new int* [V];
  35.             parent = new int[V];
  36.             for (int i = 0; i < V; i++) {
  37.                 G[i] = new int[V];
  38.                 parent[i] = i;
  39.                 for (int j = 0; i < V; j++)
  40.                     in >> G[i][j];
  41.             }
  42.         }
  43.         else {
  44.             cout << "File is not found. Try again." << endl;
  45.             G = NULL;
  46.         }
  47.         T = new int* [V - 1];
  48.         for (int i = 0; i < V - 1; i++) {
  49.             T[i] = new int[3];
  50.         }
  51.     }
  52.     int** setGk() {
  53.         int** Gk = new int* [0];
  54.         for (int i = 0; i < R; i++)
  55.             Gk[i] = new int[3];
  56.  
  57.         int k = 0;
  58.         for (int i = 0; i < V; i++) {
  59.             for (int j = i; j < V; j++) {
  60.                 if (G[i][j] != 0) {
  61.                     Gk[k][_z] = G[i][j];
  62.                     Gk[k][_x] = i;
  63.                     Gk[k][_y] = j;
  64.                     k++;
  65.                 }
  66.             }
  67.         }
  68.         return Gk;
  69.     }
  70.  
  71.     void print() {
  72.         if (G == NULL)
  73.             return;
  74.  
  75.         ofstream out_res("output.txt", ios::app);
  76.         out_res << "Edge: " << "Weight:" << endl;
  77.         for (int i = 0; i < V - 1; i++)
  78.             out_res << T[i][_x] << " - " << T[i][_y] << " : " << T[i][_z] << endl;
  79.     }
  80. };
  81.  
  82. void sortGk(int** Gk, int R) { // сортировка графа в порядке возрастания (пузырьком)
  83.     for (int i = 1; i < R; i++) {
  84.         compare++;
  85.         assign++;
  86.         for (int j = 0; j < R - i; j++) {
  87.             assign++;
  88.             compare++;
  89.             if (Gk[j][_z] > Gk[j + 1][_z]) {
  90.                 compare++;
  91.                 int* tmp = Gk[j];
  92.                 Gk[j] = Gk[j + 1];
  93.                 Gk[j + 1] = tmp;
  94.             }
  95.         }
  96.     }
  97. }
  98.  
  99. int graph::find_set(int i) {
  100.     if (i == parent[i]) {
  101.         compare++;
  102.         return i;
  103.     }
  104.     else
  105.         return find_set(parent[i]);
  106. }
  107.  
  108. void graph::union_set(int r, int v) {
  109.     parent[r] = parent[v];
  110.     assign++;
  111. }
  112.  
  113. void graph::kraskal() {
  114.     if (G == NULL)
  115.         return;
  116.     compare = 0, assign = 0;
  117.  
  118.  
  119.     int k = 0, uRep, vRep;
  120.     int** Gk = setGk(); // сортируем граф
  121.     sortGk(Gk, R);
  122.     for (int i = 0; i < R; i++) {
  123.         compare++;
  124.         uRep = find_set(Gk[i][_x]);
  125.         vRep = find_set(Gk[i][_y]);
  126.         assign += 2;
  127.         if (uRep != vRep) {  // Если не удается создать цикл, тогда добавляем ребро в остовное дерево
  128.             T[k][_x] = Gk[i][_x] + 1;
  129.             T[k][_y] = Gk[i][_y] + 1;
  130.             T[k][_z] = Gk[i][_z];
  131.             k++;
  132.             assign += 4; // добавляем кластер
  133.             union_set(uRep, vRep);
  134.         }
  135.     }
  136. }
  137.  
  138. void graph::prima() {
  139.     return;
  140.     compare = 0, assign = 0;
  141.     bool* selected = new bool[V]();
  142.     int no_edge = 0;
  143.     selected[0] = true;
  144.     assign += 2;
  145.     while (no_edge < V - 1) { // коли вершина входить в остове дерево, то ми її помічаємо. Вибираємо 2 вершини, щоб вони не з одної множини складувались.
  146.         if (G == NULL)
  147.             compare++;
  148.         int min = Infinity;
  149.         int x = 0, y = 0;
  150.         assign += 3;
  151.  
  152.         for (int i = 0; i < V; i++) {
  153.             assign++;
  154.             compare++;
  155.             if (selected[i]) {
  156.                 compare++;
  157.                 for (int j = 0; j < V; j++) {
  158.                     compare++;
  159.                     if (!selected[j] && G[i][j]) {
  160.                         compare += 2;
  161.                         if (min > G[i][j]) {
  162.                             compare++;
  163.                             min = G[i][j];
  164.                             x = i;
  165.                             y = j;
  166.                             assign += 3;
  167.                         }
  168.                     }
  169.                 }
  170.             }
  171.         }
  172.         T[no_edge][_x] = x + 1;
  173.         T[no_edge][_y] = y + 1;
  174.         T[no_edge][_z] = min;
  175.         selected[y] = true;
  176.         no_edge++;
  177.         assign += 5;
  178.     }
  179. }
  180.  
  181. int main() {
  182.     graph g(in_file);
  183.     ofstream out_res;
  184.     out_res.open("output.txt");
  185.     out_res << "Algorithm of Kraskala: " << endl;
  186.     out_res.close();
  187.     unsigned long long Time = clock();
  188.     g.kraskal();
  189.     Time = clock() - Time;
  190.     g.print();
  191.     ofstream out_log;
  192.     out_log.open("report.txt");
  193.     out_log << "Algorithm of Kraskala: " << endl;
  194.     out_log << "Time: " << Time << "ms" << endl;
  195.     out_log << "Assign operations:" << assign << endl;
  196.     out_log << "Compare operations: " << compare << endl;
  197.     out_log.close();
  198.  
  199.     out_res.open("output.txt", ios::app);
  200.     out_res << endl << "Algorithm of Prima: " << endl;
  201.     out_res.close();
  202.     Time = clock();
  203.     g.prima();
  204.     Time = clock() - Time;
  205.     g.print();
  206.     out_log.open("report.txt", ios::app);
  207.     out_log << endl << "Algorithm of Prima: " << endl;
  208.     out_log << "Time: " << Time << "ms" << endl;
  209.     out_log << "Assign operations: " << assign << endl;
  210.     out_log << "Compare operations: " << compare << endl;
  211.     out_log.close();
  212.  
  213.     cout << "Operation completed successfully" << endl;
  214.     return 0;
  215. }
  216.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement