Advertisement
Yarodash

Graph Component

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