BoxerTC

Untitled

Mar 15th, 2015
330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | None | 0 0
  1. #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
  2. #define sc( x ) scanf( "%d" , &x )
  3. #define FOR(it,A) for( typeof A.begin() it = A.begin(); it!=A.end(); it++)
  4. #define clr( t , val ) memset( t , val , sizeof( t ) )
  5.  
  6. #define pb push_back
  7.  
  8. #define N 100005
  9.  
  10. #define VIZ(e,x) (orig[e] == x? dest[e] : orig[e])
  11.  
  12. typedef vector< int > vi;
  13.  
  14. int n,m,fin;
  15. int orig[N], dest[N], pila[N], top = 0;
  16. vi E[N];
  17. int low[N], dfsn[N], part[N], timer;
  18. int ponte[N], bicomp[N], nbicomp;
  19.  
  20. int dfsbcc (int u, int p = -1){
  21.     low[u] = dfsn[u] = ++timer;
  22.     int ch = 0;
  23.     FOR(it, E[u]){
  24.         int e = *it, v = VIZ (e, u);
  25.         if (dfsn[v] == 0){
  26.             pila[top++] = e;
  27.             dfsbcc (v, u);
  28.             low[u] = min (low[u], low[v]);
  29.             ch++;
  30.             if (low[v] >= dfsn[u]){
  31.                 part[u] = 1;
  32.                 nbicomp++;
  33.                 do{
  34.                     fin = pila[--top];
  35.                     bicomp[fin] = nbicomp;
  36.                 }while (fin != e);
  37.             }
  38.             if (low[v] == dfsn[v]) ponte[e] = 1;
  39.         }else if (v!=p && dfsn[v] < dfsn[u]){
  40.             pila[top++] = e;
  41.             low[u] = min (low[u], dfsn[v]);
  42.         }
  43.     }
  44.     return ch;
  45. }
  46. void bcc (){
  47.     f(i,0,n) part[i] = dfsn[i] = 0;
  48.     f(i,0,m) ponte[i] = 0;
  49.     nbicomp = timer = 0;
  50.     f(i,0,n) if (dfsn[i] == 0) part[i] = dfsbcc (i) >= 2;
  51. }
  52.  
  53. int main()
  54. {
  55.     cin >> n >> m;
  56.     f(i,0,m){
  57.         int u,v; cin >> u >> v; u--; v--;
  58.         orig[i] = u;
  59.         dest[i] = v;
  60.         E[u].pb (i);
  61.         E[v].pb (i);
  62.     }
  63.     bcc();
  64.     f(i,0,n) cout << part[i]; cout << endl;
  65.     f(i,0,m) cout << ponte[i]; cout << endl;
  66.     f(i,0,m) cout << bicomp[i]; cout << endl;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment