Advertisement
Yarodash

Graph Component 2.0

Jan 28th, 2020
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. struct edge{
  7.     int v;
  8.     bool only;
  9.     bool used;
  10. };
  11.  
  12. vector<vector<edge> > edges;
  13. vector<int> parent;
  14. vector<bool> w;
  15. vector<bool> _w;
  16. vector<int> color;
  17. vector<int> history;
  18. int n, m;
  19.  
  20. int f = 0;
  21. void dump_history(){
  22.     f++;
  23.     cout << "#" << ++f << " : ";
  24.     for (int i = 0; i < history.size(); i++)
  25.         cout << history[i] << " ";
  26.     cout << endl;
  27. }
  28.  
  29. int dfs(int v, int u){
  30.     _w[v] = true;
  31.     if (w[v]) return -1;
  32.     //history.push_back(v);
  33.     //dump_history();
  34.  
  35.     int _buf = parent[v];
  36.     if (parent[v] == -2) parent[v] = u; else
  37.     if (parent[v] != u) parent[v] = -1;
  38.  
  39.    {
  40.         w[v] = true;
  41.  
  42.         for (int i = 0; i < edges[v].size(); i++){
  43.             if (edges[v][i].used) continue;
  44.             int q = edges[v][i].v;
  45.             int result = dfs(q, v);
  46.             if (result == 0) edges[v][i].used = true;
  47.         }
  48.  
  49.         w[v] = false;
  50.     }
  51.     //history.pop_back();
  52.     return 0;
  53. }
  54.  
  55. int _find(int u, int v){
  56.     for (int i = 0; i < edges[u].size(); i++)
  57.         if (edges[u][i].v == v)
  58.             return i;
  59. }
  60.  
  61. void colorise(int v, int c){
  62.     if (w[v]) return;
  63.     color[v] = c;
  64.     w[v] = true;
  65.     for (int i = 0; i < edges[v].size(); i++){
  66.         if (edges[v][i].only == false) {
  67.             colorise(edges[v][i].v, c);
  68.         }
  69.     }
  70. }
  71.  
  72. int main()
  73. {
  74.     cin >> n >> m;
  75.     edges.resize(n);
  76.     edge e; e.only = false; e.used = false;
  77.     int u, v;
  78.     for (int i = 0; i < m; i++){
  79.         cin >> u >> v;
  80.         //u = (rand()*rand()+rand())%n; v = rand()%n;
  81.         u--; v--;
  82.         e.v = v; edges[u].push_back(e);
  83.         e.v = u; edges[v].push_back(e);
  84.     }
  85.  
  86.     parent.resize(n, -2);
  87.     w.resize(n, false);
  88.     _w.resize(n, false);
  89.      for (int i = 0; i < n; i++){
  90.         if (!(_w[i]))
  91.             dfs(i, -2);
  92.         parent[0] = -1;
  93.      }
  94.     /*for (int i = 0; i < n; i++){
  95.         cout << parent[i] << " ";
  96.     } cout << endl;*/
  97.  
  98.     for (int i = 0; i < n; i++){
  99.         if (parent[i] >= 0) {
  100.             int r = _find(i, parent[i]);
  101.             edges[i][r].only = true;
  102.             r = _find(parent[i], i);
  103.             edges[parent[i]][r].only = true;
  104.         }
  105.     }
  106.  
  107.     color.resize(n, -1);
  108.     int _color = 0;
  109.     for (int i = 0; i < n; i++) w[i] = false;
  110.     for (int i = 0; i < n; i++){
  111.         if (color[i] == -1) {
  112.             _color++;
  113.             colorise(i, _color);
  114.         }
  115.     }
  116.  
  117.     for (int i = 0; i < n; i++){
  118.         cout << color[i] << " ";
  119.     }
  120.     cout << endl;
  121.  
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement