Advertisement
Val_Kir

3 лаба

Jul 2nd, 2020
1,012
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. //Класс для представления графа с помощью матрицы смежности:
  8. class MGraph
  9. {
  10.     int vernum; //число вершин
  11.     bool oriented; //true - ориентированный; false - неориентированный
  12.     bool** matrix; //матрица смежности
  13.     int comptotal = 0; //число компонент
  14.     int zmax, //максимальное число цветов, используемых на текущем шаге
  15.         zcur, //число различных цветов в Pcur на текущем шаге
  16.         zmin, //число различных цаетов в Pmin
  17.         * Pmin, //текущая минимальная раскраска
  18.         * Pcur;// текущая раскраска
  19. public:
  20.     //конструктор
  21.     MGraph(int vrnum, bool orient)
  22.     {
  23.         vernum = vrnum;
  24.         oriented = orient;
  25.         matrix = new bool* [vrnum];
  26.         for (int i = 0; i < vrnum; i++)
  27.             matrix[i] = new bool[vrnum];
  28.         for (int i = 0; i < vrnum; i++)
  29.         {
  30.             for (int j = 0; j < vrnum; j++)
  31.                 matrix[i][j] = false;
  32.         }
  33.     }
  34.     //деструктор
  35.     ~MGraph()
  36.     {
  37.         for (int i = 0; i < vernum; i++)
  38.         {
  39.             delete[] matrix[i];
  40.         }
  41.         delete[] matrix;
  42.     }
  43.     int getvernum() //получить число вершин
  44.     {
  45.         return vernum;
  46.     }
  47.     bool getmatrix(int a, int b) // получить матрицу смежности
  48.     {
  49.         return matrix[a][b];
  50.     }
  51. //задаем ребра дуги
  52.     void setedge(int a, int b)
  53.     {
  54.         if (a < 0 || a >= vernum) return;
  55.         if (b < 0 || b >= vernum) return;
  56.         matrix[a][b] = true;
  57.         if (!oriented) matrix[b][a] = true;
  58.     }
  59.  
  60.     void removeedge(int a, int b)
  61.     {
  62.         if (a < 0) return;
  63.         if (b < 0) return;
  64.         matrix[a][b] = false;
  65.         if (!oriented) matrix[b][a] = false;
  66.     }
  67. //методы для выделения компонент
  68.     void cdeep(int cver, int* R)
  69.     {
  70.         R[cver] = this->comptotal;
  71.         for (int i = 0; i < vernum; i++)
  72.             if (matrix[cver][i] && !R[i])
  73.                 cdeep(i, R);
  74.     }
  75.     int* getcomp()
  76.     {
  77.         int i, * R = new int[vernum];
  78.         for (i = 0; i < vernum; i++)
  79.             R[i] = 0;
  80.         for (i = 0; i < vernum; i++)
  81.             if (!R[i])
  82.             {
  83.                 this->comptotal = this->comptotal++;
  84.                 cdeep(i, R);
  85.             }
  86.         return R;
  87.     }
  88. /*cver – текущая проверяемая вершина,
  89. R – массив номеров в порядке обхода (R[i]=0, если вершина i пока не проверена),
  90. cnum – текущий номер в порядке обхода.
  91. Трудоемкость алгоритма DFS на матрице смежности составляет O(|𝑽|^𝟐).
  92. */
  93.  
  94.     void deep(int cver, int* R, int& cnum)
  95.     {
  96.         R[cver] = ++cnum;
  97.         for (int i = 0; i < vernum; i++)
  98.             if (matrix[cver][i] && !R[i]) deep(i, R, cnum);
  99.  
  100.     }
  101.     friend ostream& operator<<(ostream& out, MGraph& graph)
  102.     {
  103.         for (int i = 0; i < graph.getvernum(); i++)
  104.         {
  105.             out << endl;
  106.             for (int j = 0; j < graph.getvernum(); i++)
  107.             {
  108.                 out << graph.getmatrix(i, j) << " ";
  109.             }
  110.         }
  111.         return out;
  112.     }
  113.     //поиск в ширину
  114.     int* BFS(int start)
  115.     {
  116.         int u, x, * lev = new int[vernum];
  117.         vector <int> QUE;
  118.         for (u = 0; u < vernum; u++)
  119.             lev[u] = 0;
  120.         lev[start] = 1;
  121.         QUE.insert(QUE.begin(), start);
  122.         while (!QUE.empty())
  123.         {
  124.             u = QUE.back();
  125.             for (x = 0; x < vernum; x++)
  126.                 if (matrix[u][x] && !lev[x])
  127.                 {
  128.                     lev[x] = lev[u] + 1;
  129.                     QUE.insert(QUE.begin(), x);
  130.                 }
  131.             QUE.pop_back();
  132.  
  133.         }
  134.         return lev;
  135.     }
  136.     //поиск в глубину
  137.     int* DFS()
  138.     {
  139.         int i, cnum, * R = new int[vernum];
  140.         for (i = 0; i < vernum; i++) R[i] = 0;
  141.         for (cnum = i = 0; i < vernum; i++)
  142.             if (!R[i])
  143.                 deep(i, R, cnum);
  144.         return R;
  145.     }
  146.     void file(const char* name, int nver)
  147.     {
  148.         bool ver;
  149.         ifstream fin(name);
  150.         for (int i = 0; i < nver; i++)
  151.         {
  152.             for (int j = 0; j < nver; j++)
  153.             {
  154.                 fin >> ver;
  155.                 if (ver)
  156.                     this->setedge(i, j);
  157.             }
  158.         }
  159.     }
  160.     //формирование начальной раскраски, первый вызов рекурсивной функции Paint
  161.     void init_paint()
  162.     {
  163.         zmin = vernum; //число различных цветов в Pmin
  164.         Pmin = new int[vernum];
  165.         Pcur = new int[vernum];
  166.         for (int i = 0; i < vernum; i++)
  167.             Pmin[i] = i;
  168.         Pcur[0] = 0;
  169.         Paint(0, 1);
  170.     }
  171. //gjkextybt vbybvfkmyjq hfccrhfcrb
  172.     int* get_chrom()
  173.     {
  174.         return Pmin;
  175.     }
  176.     //рекурсивная функция раскраски
  177.     void Paint(int k, int z)
  178.     {
  179.         int j;
  180.         zmax = min(z + 1, zmin - 1); //максимальное число цветов
  181.         for (int col = 0; col <= zmax; col++) //по цветам
  182.         {
  183.             for (j = 0; j <= k; j++) //проверка смежных
  184.                 if (matrix[j][k + 1] == 1 && Pcur[j] == col) break;
  185.             if (j > k) //красим k+1 в цвет col
  186.             {
  187.                 Pcur[k + 1] = col; zcur = max(col, z);
  188.                 if (k + 1 < vernum) Paint(k + 1, zcur);
  189.                 else if (zcur < zmin) //минимальная раскраска
  190.                     for (zmin = zcur, j = 0; j <= vernum; j++)
  191.                         Pmin[j] = Pcur[j];
  192.             }
  193.         }
  194.  
  195.     }
  196. };
  197. int main()
  198. {
  199.     setlocale(LC_ALL, "rus");
  200.     MGraph test(6, 0);
  201.     test.file("ver_6.txt", 6);
  202.     int* BFS = test.BFS(0);
  203.     int* components = test.getcomp();
  204.     test.init_paint();
  205.     int* chrom = test.get_chrom();
  206.     int* DFS = test.DFS();
  207.     cout << endl << "Поиск в ширину:" << endl;
  208.     for (int i = 0; i < 6; i++)cout << BFS[i] << ' ';
  209.     cout << endl << "Компоненты:" << endl;
  210.     for (int i = 0; i < 6; i++)cout << components[i] << ' ';
  211.     cout << endl << "Раскраска:" << endl;
  212.     for (int i = 0; i < 6; i++)cout << chrom[i] << ' ';
  213.     cout << endl << "Поиск в глубину:" << endl;
  214.     for (int i = 0; i < 6; i++)cout << DFS[i] << ' ';
  215.     cout << endl;
  216.  
  217.  
  218.     MGraph test1(10, 0);
  219.     test1.file("ver_12.txt", 10);
  220.     int* BFS1 = test1.BFS(6);
  221.     int* components1 = test1.getcomp();
  222.     test1.init_paint();
  223.     int* chrom1 = test1.get_chrom();
  224.     int* DFS1 = test1.DFS();
  225.     cout << endl << "Поиск в ширину:" << endl;
  226.     for (int i = 0; i < 10; i++)cout << BFS1[i] << ' ';
  227.     cout << endl << "Компоненты:" << endl;
  228.     for (int i = 0; i < 10; i++)cout << components1[i] << ' ';
  229.     cout << endl << "Раскраска:" << endl;
  230.     for (int i = 0; i < 10; i++)cout << chrom1[i] << ' ';
  231.     cout << endl << "Поиск в глубину:" << endl;
  232.     for (int i = 0; i < 10; i++)cout << DFS1[i] << ' ';
  233.     cout << endl;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement