Cod sursa(job #2001077)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 15 iulie 2017 16:58:19
Problema Andrei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("andrei.in");
ofstream out("andrei.out");
const int NMAX = 100005;

vector<int> G[2*NMAX];
vector<int> GT[2*NMAX];

int N,M,viz[2*NMAX],ctc[2*NMAX],st[2*NMAX],nr_ctc,sz;

int ind(int a)
{

    if(a > 0)
        return 2*a-1;
    else
        return -2*a;
}

void adauga(int x,int y)
{

    G[ind(-x)].push_back(ind(y));
    G[ind(-y)].push_back(ind(x));

    GT[ind(y)].push_back(ind(-x));
    GT[ind(x)].push_back(ind(-y));
}

void dfs(int nod)
{

    viz[nod] = 1;
    for(vector<int>::iterator it = G[nod].begin() ; it != G[nod].end() ; ++it)
        if(!viz[*it])
            dfs(*it);
    st[++sz] = nod;
}

void comp(int nod)
{

    viz[nod] = 0;
    ctc[nod] = nr_ctc;
    for(vector<int>::iterator it = GT[nod].begin() ; it != GT[nod].end() ; ++it)
        if(viz[*it])
            comp(*it);
}

int main()
{

    in>>N>>M;
    int a,b,c;
    for(int i = 1 ; i <= M ; ++i){

        in>>a>>b>>c;
        if(c == 0)
            adauga(a,b);
        else if(c == 1)
            adauga(-a,-b);
        else{
            adauga(-a,b);
            adauga(a,-b);
        }
    }

    for(int i = 1 ; i <= 2*N ; ++i)
        if(!viz[i])
            dfs(i);

    for(int i = 2 * N ; i > 0 ; --i)
        if(viz[st[i]]){
            nr_ctc++;
            comp(st[i]);
        }

    for(int i = 1 ; i <= N ; ++i)
        out<<(ctc[ind(i)] < ctc[ind(-i)])<<" ";
    return 0;
}