Advertisement
DacCum

Алгоритм Прима и Краскала

Nov 9th, 2021
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. #define INF 9999999
  6. #define _x 0
  7. #define _y 1
  8. #define _w 2
  9.  
  10. class graph {
  11. private:
  12.     int** G;
  13.     int** T;
  14.     int V;
  15.     int U;
  16. public:
  17.     graph() {
  18.         G = NULL;
  19.         T = NULL;
  20.         V = -1;
  21.         U = -1;
  22.     }
  23.     graph(int _V, int _U) {
  24.         V = _V;
  25.         U = _U;
  26.         G = new int* [V];
  27.         for (int i = 0; i < V; i++) {
  28.             G[i] = new int[V];
  29.             for (int j = 0; j < V; j++)
  30.                 cin >> G[i][j];
  31.         }
  32.         T = new int* [V - 1];
  33.         for (int i = 0; i < V - 1; i++) {
  34.             T[i] = new int[3];
  35.         }
  36.     }
  37.     int** setGk() {
  38.         int** Gk = new int* [U];
  39.         for (int i = 0; i < U; i++)
  40.             Gk[i] = new int[3];
  41.         int k = 0;
  42.         for (int i = 0; i < V; i++)
  43.             for (int j = i + 1; j < V; j++)
  44.                 if (G[i][j] != 0) {
  45.                     Gk[k][_w] = G[i][j];
  46.                     Gk[k][_x] = i;
  47.                     Gk[k][_y] = j;
  48.                     k++;
  49.                 }
  50.  
  51.         return Gk;
  52.     }
  53.     void kruskal();
  54.     void prima();
  55.     void print() {
  56.         cout << "Edge :" << " Weight" << endl;
  57.         for (int i = 0; i < V - 1; i++)
  58.             cout << T[i][_x] << " - " << T[i][_y] << " : " << T[i][_w] << endl;
  59.     }
  60. };
  61.  
  62. void sortGk(int** Gk, int U) {
  63.     for (int i = 1; i < U; i++)
  64.         for (int j = 0; j < U - i; j++)
  65.             if (Gk[j][_w] > Gk[j + 1][_w]) {
  66.                 int* tmp = Gk[j];
  67.                 Gk[j] = Gk[j + 1];
  68.                 Gk[j + 1] = tmp;
  69.             }
  70. }
  71.  
  72. void graph::kruskal() {
  73.     bool *visited = new bool[V]();
  74.     int** Gk = setGk();
  75.     sortGk(Gk, U);
  76.     int k = 0;
  77.     for (int i = 0; i < U; i++)
  78.         if (!visited[Gk[i][_x]] || !visited[Gk[i][_y]]) {
  79.             T[k][_w] = Gk[i][_w];
  80.             T[k][_x] = Gk[i][_x] + 1;
  81.             T[k][_y] = Gk[i][_y] + 1;          
  82.             k++;
  83.             visited[Gk[i][_x]] = true;
  84.             visited[Gk[i][_y]] = true;
  85.         }
  86. }
  87.  
  88. void graph::prima() {
  89.     int no_edge = 0;
  90.     bool *visited = new bool[V]();
  91.     visited[0] = true;
  92.     while (no_edge < V - 1) {
  93.         int min = INF;
  94.         int x = 0;
  95.         int y = 0;
  96.  
  97.         for (int i = 0; i < V; i++)
  98.             if (visited[i])
  99.                 for (int j = 0; j < V; j++)
  100.                     if (!visited[j] && G[i][j])
  101.                         if (min > G[i][j]) {
  102.                             min = G[i][j];
  103.                             x = i;
  104.                             y = j;
  105.                         }
  106.  
  107.         T[no_edge][_x] = x + 1;
  108.         T[no_edge][_y] = y + 1;
  109.         T[no_edge][_w] = min;
  110.         visited[y] = true;
  111.         no_edge++;
  112.     }
  113. }
  114.  
  115. int main() {
  116.     graph g(10, 16);
  117.     g.kruskal();
  118.     g.print();
  119.     cout << endl;
  120.     g.prima();
  121.     g.print();
  122.  
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement