Cod sursa(job #474155)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 2 august 2010 16:55:50
Problema Andrei Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 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;

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

inline int32 Fort( int32 mul, int32 muc ) {

    if( mul == 1 ) {

        if( muc == 0 )
            return 2;
        if( muc == 2 )
            return 1;
    }

    if( mul == 2 ) {

        if( muc == 1 )
            return 1;
        if( muc == 2 )
            return 2;
    }

    return 0;
}

inline int01 Cont( int32 mul0, int32 mul1, int32 muc ) {

    if( Fort( mul0, muc ) && Fort( mul0, muc ) != mul1 )
        return 0;

    return 1;
}

int01 Check( int32 nod, int32 mul ) {

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

    if( !mul )
        return 1;

    ok = true;
    f[nod] = 2;
    m[nod] = mul;

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

        if( !f[it->first] )
            ok &= Check( it->first, Fort( mul, it->second ) );
        else
            ok &= Cont( mul, m[it->first], it->second );
    }

    return ok;
}

void DF( int32 nod ) {

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

    f[nod] = 1;
    for( it = v[nod].begin(); it != v[nod].end(); ++it )
        if( f[it->first] != 1 && Fort( m[nod], it->second ) ) {

            m[it->first] = Fort( m[nod], it->second );
            DF( it->first );
        }
}

int32 main() {

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

    int32 i, a, b, c;

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

        fin >> a >> b >> c;
        v[a].push_back( make_pair( b, c ) );
        v[b].push_back( make_pair( a, c ) );
    }

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

            if( Check( i, 1 ) )
                m[i] = 1;
            else
                m[i] = 2;
            DF( i );
        }

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

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

    return 0;
}