Cod sursa(job #1937122)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 23 martie 2017 18:56:23
Problema Andrei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>
using namespace std;

fstream in ( "andrei.in" , ios::in  );
fstream out( "andrei.out", ios::out );

const int DIM = 2e5 + 5;

vector<int> edg[DIM], stk;
int low[DIM], lev[DIM], ans[DIM];

inline int f( int x, int n ) {
    return ( x <= n ) ? ( x + n ) : ( x - n );
}

void dfs( int x, int n, int &dt ) {
    low[x] = lev[x] = ++ dt;
    stk.push_back( x );
    
    for( int y : edg[x] ) {
        if( lev[y] == 0 )
            dfs( y, n, dt );
        if( lev[y] >  0 )
            low[x] = min( low[x], low[y] );
    }
    
    if( low[x] == lev[x] ) {
        int y;
        do {
            y = stk.back();
            stk.pop_back();
            
            lev[y] *= -1;
            if( ans[y] == 0 ) {
                ans[y] = 1;
                ans[f(y, n)] = -1;
            }
        } while( x != y );
    }
    
    return;
}

int main( void ) {
    ios::sync_with_stdio( false );
    
    int n, m;
    in >> n >> m;
    
    for( int i = 1; i <= m; i ++ ) {
        int x, y, z;
        in >> x >> y >> z;
        
        switch( z ) {
            case 0:
                edg[f(x, n)].push_back( y );
                edg[f(y, n)].push_back( x );
                break;
            case 1:
                edg[x].push_back( f(y, n) );
                edg[y].push_back( f(x, n) );
                break;
            case 2:
                edg[x].push_back( y );
                edg[y].push_back( x );
                break;
        }
    }
    
    for( int i = 1, dt = 0; i <= n * 2; i ++ ) {
        if( lev[i] == 0 )
            dfs( i, n, dt );
    }
    
    for( int i = 1; i <= n; i ++ )
        out << ( ans[i] < 0 ) << " ";
    out << endl;
    
    return 0;
}