Cod sursa(job #466687)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 27 iunie 2010 13:10:42
Problema Andrei Scor Ascuns
Compilator cpp Status done
Runda Marime 1.59 kb
#include <cstdio>
#include <cassert>
#include <vector>

using namespace std;

#define MAXN 100000
#define MAXM 200000

int N, M;
char set[MAXN]; int col[MAXN];
vector<pair<int, int> > con[MAXN];

inline int color(int nod, int c) {
    if (set[nod]) {
        return col[nod] == c;
    }
    col[nod] = c;
    set[nod] = 1;

    vector<pair<int, int> > :: iterator it;
    for (it = con[nod].begin(); it != con[nod].end(); it++) {
        if (it->second == 0 && col[nod] == 0) {
            if (!color(it->first, 1)) {
                set[nod] = 0;
                return 0;
            }
        }
        if (it->second == 1 && col[nod] == 1) {
            if (!color(it->first, 0)) {
                set[nod] = 0;
                return 0;
            }
        }
        if (it->second == 2) {
            if (!color(it->first, col[nod])) {
                set[nod] = 0;
                return 0;
            }
        }
    }
    return 1;
}

int main() {
    freopen("andrei.in", "rt", stdin);
#ifndef DEBUG
    freopen("andrei.out", "wt", stdout);
#endif

    assert(scanf("%d %d", &N, &M) == 2);
    assert(1 <= N && N <= MAXN);
    assert(1 <= M && M <= MAXM);
    for (int i = 0; i < M; i++) {
        int x, y, c;
        assert(scanf("%d %d %d", &x, &y, &c) == 3);
        con[x].push_back(make_pair(y, c));
        con[y].push_back(make_pair(x, c));
    }

    for (int i = 1; i <= N; i++) {
        if (!set[i]) {
            if (!color(i, 0)) {
                color(i, 1);
            }
        }
    }

    for (int i = 1; i <= N; i++) {
        printf("%d ", col[i]);
    }
    printf("\n");

    return 0;
}