Advertisement
Guest User

Untitled

a guest
Oct 13th, 2015
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <fstream>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <set>
  9. #include <map>
  10.  
  11. using namespace std;
  12.    
  13. int n, m, timer, cc, col;
  14. bool color[200001], ans[200001];
  15. vector<pair<int, int> > edge[200001];
  16. int in_t[200001], ans_t[200001], AnsRes[200001];
  17. map <pair<int, int>, int> res;
  18. vector <int> stackAns;
  19.  
  20. void cleanStack(int ww, int coll) {
  21.     while (stackAns.back() != ww) {
  22.         AnsRes[stackAns.back()] = coll;
  23.         stackAns.pop_back();
  24.     }
  25.     AnsRes[stackAns.back()] = coll;
  26.     stackAns.pop_back();
  27. }
  28.  
  29. void dfs(int cur, int parent) {
  30.     int ch = 0;
  31.     color[cur] = true;
  32.     timer++;
  33.     in_t[cur] = timer;
  34.     ans_t[cur] = timer;
  35.     for (int i = 0; i < edge[cur].size(); i++) {
  36.         int cur_t = edge[cur][i].first;
  37.         if (cur_t == parent) {
  38.             continue;
  39.         }
  40.         if (cur_t != parent) {
  41.             if (!color[cur_t]) {
  42.                 stackAns.push_back(edge[cur][i].second);    
  43.                 dfs(cur_t, cur);
  44.                 ch++;
  45.                 if (ans_t[cur_t] >= in_t[cur]) {
  46.                     col++;
  47.                     int qq = edge[cur][i].second;
  48.                     cleanStack(qq, col);
  49.                 }
  50.                 if (ans_t[cur_t] < ans_t[cur]) {
  51.                     ans_t[cur] = ans_t[cur_t];
  52.                 }
  53.             } else {
  54.                 if (ans_t[cur] > in_t[cur_t]) {
  55.                     ans_t[cur] = ans_t[cur_t];
  56.                 }
  57.                 if (in_t[cur_t] < in_t[cur]) {
  58.                     stackAns.push_back(edge[cur][i].second);
  59.                 }
  60.             }
  61.         }
  62.     }
  63.  
  64. }
  65.  
  66. void dfs2(int v, int c, int p) {
  67.     color[v] = true;
  68.     for (int i = 0; i < edge[v].size(); i++) {
  69.         int cur_v = edge[v][i].first;
  70.         if (cur_v == p) {
  71.             continue;
  72.         }
  73.         if (!color[cur_v]) {
  74.             if (ans_t[cur_v] >= in_t[v]) {
  75.                 cc++;
  76.                 res[make_pair((min(v, cur_v)), (max(v, cur_v)))] = cc;
  77.                 dfs2(cur_v, cc, v);
  78.             } else {
  79.                 res[make_pair((min(v, cur_v)), (max(v, cur_v)))] = c;  
  80.                 dfs2(cur_v, c, v);
  81.             }
  82.         } else {
  83.             if (in_t[cur_v] <= in_t[v]) {
  84.                 res[make_pair((min(v, cur_v)), (max(v, cur_v)))] = c;      
  85.             }
  86.         }
  87.     }
  88. }
  89.  
  90.  
  91.    
  92. int main() {
  93.     freopen ("biconv.in", "r", stdin);
  94.     freopen ("biconv.out", "w", stdout);
  95.  
  96.     cin >> n >> m;
  97.  
  98.     for (int i = 0; i < m; i++) {
  99.         int b, e;
  100.         cin >> b >> e;
  101.         b--;
  102.         e--;
  103.         edge[b].push_back(make_pair(e, i));
  104.         edge[e].push_back(make_pair(b, i));
  105.     }
  106.  
  107.     for (int i = 0; i < m; i++) {
  108.         color[i] = false;
  109.     }
  110.  
  111.     timer = 1;
  112.     int cnt = 0;
  113.     col = 0;
  114.      
  115.     for (int i = 0; i < n; i++) {
  116.         if (!color[i]) {
  117.             timer = 1;
  118.             dfs(i, -1);
  119.         }
  120.     }
  121.      
  122.     for (int i = 0; i < n; i++) {
  123.         if (ans[i]) {
  124.             cnt++;
  125.         }
  126.     }
  127.  
  128.     for (int i = 0; i < m; i++) {
  129.         color[i] = false;
  130.     }
  131.  
  132.     cc = 0;
  133.  
  134.     for (int i = 0; i < n; i++) {
  135.         if(!color[i]) {
  136.             dfs2(i, -1, -1);
  137.         }
  138.     }
  139.  
  140.     cout << col << endl;
  141.     for (int i = 0; i < m; i++) {
  142.         cout << AnsRes[i] << " ";
  143.     }
  144.  
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement