nikolaj

comp

Apr 27th, 2015
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <map>
  7.  
  8. #define pb push_back
  9. #define mp make_pair
  10. #define eprintf(...) fprintf(stderr, __VA_ARGS__)
  11.  
  12. using namespace std;
  13. const int maxn = int(1e5) + 10;
  14.  
  15. int used[maxn], p[maxn][30], used_up[maxn], d[maxn], us[maxn], even[maxn], ret[maxn];
  16. vector <int> a[maxn], a1[maxn], q, g[maxn];
  17. map < pair <int, int>, int> ma;
  18.  
  19. void dfs_up ( int v)
  20. {
  21.     used_up[v] = 1;
  22.     for ( int i = 0; i < (int)g[v].size(); i++) {
  23.         int to = g[v][i];
  24.         d[to] = d[v] + 1;
  25.         if (used_up[to] == 0) {
  26.             dfs_up(to);
  27.             p[to][0] = v;
  28.         }
  29.     }
  30. }
  31. int col, tim;
  32. void paint (int v)
  33. {
  34.         eprintf("paint %d!\n", v);
  35.         for (int i = 0; i < (int)q.size(); i++) eprintf("%d%c", q[i], " \n"[i + 1 == (int)q.size()]);
  36.     col++;
  37.     while (!q.empty()){
  38.                 int u = q.back();
  39.         used[u] = col;
  40.         q.pop_back();
  41.                 if (u == v) break;
  42.     }
  43. }
  44.  
  45.  
  46. void dfs (int v, int p = -1)
  47. {
  48.     tim++;
  49.     us[v] = 1;
  50.     q.pb(v);
  51.     even[v] = tim;
  52.     ret[v] = tim;
  53.     for (auto to : a[v]){
  54.         if (to == p) {
  55.                     continue;
  56.                 }
  57.         if ( us[to] == 1){
  58.             ret[v] = min(ret[v], even[to]);
  59.                 } else {
  60.             dfs(to, v);
  61.             ret[v] = min(ret[v], ret[to]);
  62.             if (ret[to] > even[v]) {
  63.                 paint(to);
  64.                             }
  65.         }
  66.     }
  67. }
  68.  
  69.  
  70. int main()
  71. {
  72.     int n, m;
  73.     scanf("%d%d",&n, &m);
  74.         int f;
  75.         scanf("%d", &f);
  76.         f--;
  77.  
  78.         for (int i = 0; i < n; i++) used[i] = -1;
  79.     for (int i = 0; i < m; i++) {
  80.         int u, v;
  81.         scanf("%d%d", &u, &v);
  82.         u--, v--;
  83.         a[u].pb(v);
  84.         a[v].pb(u);
  85.     }
  86.     dfs(f);
  87.     paint(f);
  88.  
  89.     for ( int i = 0; i < n; i++)
  90.         printf("%d ", used[i]);
  91.     printf("\n");
  92. }
Advertisement
Add Comment
Please, Sign In to add comment