Cod sursa(job #473464)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 29 iulie 2010 16:24:41
Problema Andrei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.39 kb
#include <algorithm>
#include <cassert>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <bitset>
#include <deque>
#include <fstream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

using namespace std;

typedef bool int01;
typedef char cha08;
typedef short int int16;
typedef int int32;
typedef float rea32;
typedef long long int int64;
typedef double rea64;

const cha08 Input[] = "andrei.in";
const cha08 Output[] = "andrei.out";

const int32 Dim = 100001;

int01 viz[Dim];
int32 N, M;
int32 f[Dim];
vector < pair <int32, int32> > v[Dim];

int01 Check( int32 nod, int32 mul ) {

    vector < pair <int32, int32> > :: iterator it;

    viz[nod] = true;
    for( it = v[nod].begin(); it != v[nod].end(); ++it )
        if( viz[it->first] == false ) {

            if( mul == 1 ) {

                if( it->second == 0 && !f[it->first] )
                    Check( it->first, 2 );
                else if( it->second && f[it->first] != 2 )
                    return 0;

                if( it->second == 1 )
                    continue;

                if( it->second == 2 && !f[it->first] )
                    Check( it->first, 1 );
                else if( it->second == 2 && f[it->first] != 1 )
                    return 0;

            }
            else if( mul == 2 ) {

                if( it->second == 0 )
                    continue;

                if( it->second == 1 && !f[it->first] )
                    Check( it->first, 1 );
                else if( it->second == 1 && f[it->first] != 1 )
                    return 0;

                if( it->second == 2 && !f[it->first] )
                    Check( it->first, 2 );
                else if( it->second == 2 && f[it->first] != 2 )
                    return 0;
            }
        }

    return 0;
}

void DF( int32 nod ) {

    vector < pair <int32, int32> > :: iterator it;

    for( it = v[nod].begin(); it != v[nod].end(); ++it )
        if( f[nod] == 1 ) {

            if( it->second == 0 && !f[it->first] ) {

                f[it->first] = 2;
                DF( it->first );
            }

            if( it->second == 1 )
                continue;

            if( it->second == 2 && !f[it->first] ) {

                f[it->first] = 1;
                DF( it->first );
            }
        }
        else if( f[nod] == 2 ) {

            if( it->second == 0 )
                continue;

            if( it->second == 1 && !f[it->first] ) {

                f[it->first] = 1;
                DF( it->first );
            }

            if( it->second == 2 && !f[it->first] ) {

                f[it->first] = 2;
                DF( it->first );
            }
        }
}

int32 main() {

    ifstream fin( Input );
    ofstream fout( Output );

    int32 i, c, x, y;

    fin >> N >> M;
    while( M -- ) {

        fin >> x >> y >> c;
        v[x].push_back( make_pair( y, c ) );
        v[y].push_back( make_pair( x, c ) );
    }

    for( i = 1; i <= N; ++i )
        if( !f[i] ) {

            memset( viz, false, sizeof( viz ) );
            f[i] = Check( i, 1 ) ? 1 : 2;
            DF( i );
        }

    for( i = 1; i <= N; ++i )
        fout << f[i] - 1 << " ";

    fin.close();
    fout.close();

    return 0;
}