Advertisement
igoryanchik

N6

Nov 20th, 2023 (edited)
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <algorithm>
  5. #include <numeric>
  6. #include <utility>
  7. #include <map>
  8. #include <unordered_map>
  9. using namespace std;
  10.  
  11. bool bfs(vector<vector<int>>& graph, vector<int>& parent, int start, int end)
  12. {
  13.     int len = graph.size();
  14.     vector<bool> visited(len, 0);
  15.     queue<int> q;
  16.  
  17.     visited[start] = 1;
  18.     parent[start] = -1;
  19.     q.push(start);
  20.  
  21.     while (!q.empty())
  22.     {
  23.         int v = q.front();
  24.         q.pop();
  25.  
  26.         for (int u = 0; u < len; ++u)
  27.         {
  28.             if (!visited[u] && graph[v][u] != 0)
  29.             {
  30.                 if (u == end)
  31.                 {
  32.                     parent[u] = v;
  33.                     return 1;
  34.                 }
  35.  
  36.                 visited[u] = 1;
  37.                 parent[u] = v;
  38.                 q.push(u);
  39.             }
  40.         }
  41.     }
  42.     return 0;
  43. }
  44.  
  45. int fordFulkerson(vector<vector<int>>& graph, int start, int end)
  46. {
  47.     int max_flow = 0;
  48.     vector<vector<int>> resNet = graph;
  49.     vector<int> parent(graph.size(), 0);
  50.  
  51.     while (bfs(resNet, parent, start, end))
  52.     {
  53.         int path_flow = INT_MAX;
  54.  
  55.         for (int v = end; v != start; v = parent[v])
  56.         {
  57.             int u = parent[v];
  58.             path_flow = min(path_flow, resNet[u][v]);
  59.  
  60.         }
  61.  
  62.         for (int v = end; v != start; v = parent[v])
  63.         {
  64.             int u = parent[v];
  65.             resNet[u][v] -= path_flow;
  66.             resNet[v][u] += path_flow;
  67.  
  68.         }
  69.  
  70.  
  71.         max_flow += path_flow;
  72.     }
  73.  
  74.     return max_flow;
  75. }
  76.  
  77.  
  78. bool ham_cycle(vector<vector<int>>& graph, vector<int>& path, vector<int>& visited, int start)
  79. {
  80.     int len = graph.size();
  81.     path.push_back(start);
  82.  
  83.     if (path.size() == len)
  84.     {
  85.         if (graph[path[0]][path.back()])
  86.             return 1;
  87.         else
  88.         {
  89.             path.pop_back();
  90.             return 0;
  91.         }
  92.     }
  93.  
  94.     visited[start] = 1;
  95.     for (int i = 0; i < len; ++i)
  96.         if (!visited[i] && graph[start][i] != 0)
  97.             if (ham_cycle(graph, path, visited, i))
  98.                 return 1;
  99.    
  100.     visited[start] = 0;
  101.     path.pop_back();
  102.  
  103.     return 0;
  104. }
  105.  
  106. vector<int> coloring(vector<vector<int>>& graph)
  107. {
  108.     int len = graph.size();
  109.     vector<int> result(len, -1);
  110.     vector<int> avaliable(len, 0);
  111.  
  112.     result[0] = 0;
  113.    
  114.     for (int i = 1; i < len; ++i)
  115.     {
  116.         for (int it : graph[i])
  117.             if (result[it] != -1)
  118.                 avaliable[it] = 1;
  119.  
  120.  
  121.         int color;
  122.         for (color = 0; color < len; ++color)
  123.             if (!avaliable[color])
  124.                 break;
  125.  
  126.         result[i] = color;
  127.     }
  128.  
  129.     return result;
  130. }
  131.  
  132.    
  133. int main()
  134. {
  135.     vector<vector<int>> graph = { { 0, 5, 6, 6, 6, 4, 5, 0, 0, 8, 8, 4, 4 },
  136.                                 { 5, 0, 8, 0, 3, 8, 4, 8, 6, 6, 6, 3, 4 },
  137.                                 { 6, 8, 0, 2, 0, 0, 0, 9, 3, 5, 3, 8, 1 },
  138.                                 { 6, 0, 2, 0, 2, 4, 7, 7, 7, 9, 5, 5, 5 },
  139.                                 { 6, 3, 0, 2, 0, 1, 5, 5, 4, 4, 1, 4, 2 },
  140.                                 { 4, 8, 0, 4, 1, 0, 8, 1, 5, 4, 5, 8, 6 },
  141.                                 { 5, 4, 0, 7, 5, 8, 0, 6, 9, 0, 1, 2, 0 },
  142.                                 { 0, 8, 9, 7, 5, 1, 6, 0, 4, 6, 7, 3, 3 },
  143.                                 { 0, 6, 3, 7, 4, 5, 9, 4, 0, 4, 4, 1, 1 },
  144.                                 { 8, 6, 5, 9, 4, 4, 0, 6, 4, 0, 9, 2, 7 },
  145.                                 { 8, 6, 3, 5, 1, 5, 1, 7, 4, 9, 0, 6, 9 },
  146.                                 { 4, 3, 8, 5, 4, 8, 2, 3, 1, 2, 6, 0, 3 },
  147.                                 { 4, 4, 1, 5, 2, 6, 0, 3, 1, 7, 9, 3, 0 } };
  148.  
  149.  
  150.     int max_flow = fordFulkerson(graph, 0, graph.size()-1);
  151.     cout << "Max flow: " << max_flow << '\n';
  152.  
  153.     vector<int> visited(graph.size(), 0);
  154.     vector<int> path;
  155.  
  156.     ham_cycle(graph, path, visited, 0);
  157.  
  158.     cout << "Hamilton Cycle:\n";
  159.     for (int it : path)
  160.         cout << it << " ";
  161.     cout << '\n';
  162.  
  163.     vector<int> rez = coloring(graph);
  164.  
  165.     for (int i = 0; i < graph.size(); ++i)
  166.         cout << i << "--->" << rez[i] << '\n';
  167.  
  168.  
  169.     return 0;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement