Cod sursa(job #1111387)

Utilizator danalex97Dan H Alexandru danalex97 Data 18 februarie 2014 20:45:59
Problema Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;

ifstream F("andrei.in");
ofstream G("andrei.out");

#define _it(x) vector<x>::iterator

const int N = 100010;
vector<int> v[N<<1],w[N<<1],stack;
bool mark[N<<1],ans[N<<1],no_sol;
int n,m;

int neg(int x)
{
    return x > n ? x - n : x + n;
}

void dff(int x)
{
    mark[x] = 1;
    for (_it(int) y=v[x].begin();y!=v[x].end();++y)
        if ( !mark[*y] )
            dff(*y);
    stack.push_back( x );
}

void dfs(int x)
{
    if ( ans[x] ) no_sol = 1;
    mark[x] = 1;
    ans[neg(x)] = 1;
    for (_it(int) y=w[x].begin();y!=w[x].end();++y)
        if ( !mark[*y] )
            dfs(*y);
}

void add(int x,int y)
{
    v[neg(x)].push_back(y);
    v[neg(y)].push_back(x);
    w[x].push_back(neg(y));
    w[y].push_back(neg(x));
}

int main()
{
    F>>n>>m;
    for (int i=1,x,y,t;i<=m;++i)
    {
        F>>x>>y>>t;
        if ( t == 0 ) add(x,y);
        if ( t == 1 ) add(neg(x),neg(y));
        if ( t == 2 ) add(x,neg(y)), add(neg(x),y);
    }
    for (int i=1;i<=2*n;++i)
        if ( !mark[i] )
            dff(i);
    memset(mark,0,sizeof(mark));
    for (;!stack.empty();stack.pop_back())
    {
        int x = stack.back();
        if ( !mark[x] && !mark[neg(x)] )
            dfs(x);
    }
    if ( no_sol )
        G<<"-1\n";
    else
    {
        for (int i=1;i<=n;++i)
            G<<ans[i]<<' ';
        G<<'\n';
    }
}