Cod sursa(job #467309)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 28 iunie 2010 14:01:36
Problema Andrei Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 2.35 kb
#include <stdio.h>
#include <vector>
#include <string.h>

using namespace std;

#define maxn 200010

int n, m, i, j, k, nc, nctc, a, b, c;
int f[maxn], st[maxn], st2[maxn], cl[maxn], cc[maxn], clc[maxn], ctc[maxn], clt[maxn];
vector<long> v[3][maxn], dir[maxn], inv[maxn];

void df(long comp, long tip, long nod)
{
    if(f[nod])
        return;
    f[nod]=1;
    cc[nod]=comp;
    for(long y=0; y<v[tip][nod].size(); y++)
        df(comp, tip, v[tip][nod][y]);
}

void df2(long nod)
{
    if(f[nod])
        return;
    f[nod]=1;
    for(long y=0; y<dir[nod].size(); y++)
        df2(dir[nod][y]);
    st[++st[0]]=nod;
}

void df3(long comp, long nod)
{
    if(f[nod])
        return;
    f[nod]=1;
    ctc[nod]=comp;
    for(long y=0; y<inv[nod].size(); y++)
        df3(comp, inv[nod][y]);
    st2[++st2[0]]=nod;
}

int main()
{
    freopen("andrei.in", "r", stdin);
    freopen("andrei.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d", &a, &b, &c);
        v[c][a].push_back(b);
        v[c][b].push_back(a);
    }
    for(i=1; i<=n; i++)
        if(f[i]==0)
        {
            nc++;
            df(nc, 2, i);
        }
    for(i=1; i<=n; i++)
    {
        for(j=0; j<v[0][i].size(); j++)
        {
            dir[cc[i]].push_back(cc[v[0][i][j]]+nc);
            dir[cc[v[0][i][j]]].push_back(cc[i]+nc);
            inv[cc[v[0][i][j]]+nc].push_back(cc[i]);
            inv[cc[i]+nc].push_back(cc[v[0][i][j]]);
        }
        for(j=0; j<v[1][i].size(); j++)
        {
            inv[cc[i]].push_back(cc[v[1][i][j]]+nc);
            inv[cc[v[1][i][j]]].push_back(cc[i]+nc);
            dir[cc[v[1][i][j]]+nc].push_back(cc[i]);
            dir[cc[i]+nc].push_back(cc[v[1][i][j]]);
        }
    }
    memset(f, 0, sizeof(f));
    for(i=1; i<=2*nc; i++)
        if(!f[i])
            df2(i);
    memset(f, 0, sizeof(f));
    for(i=2*nc; i; i--)
    {
        clt[i]=2;
        if(!f[st[i]])
        {
            nctc++;
            df3(nctc, st[i]);
        }
    }
    for(i=1; i<=2*nc; i++)
    {
        if(clt[ctc[st2[i]]]==2)
            clt[ctc[st2[i]]]=1;
        a=st2[i]+nc;
        if(a>2*nc)
            a-=2*nc;
        if(clt[ctc[a]]==2)
            clt[ctc[a]]=1-clt[ctc[st2[i]]];
    }
    for(i=1; i<=nc; i++)
        clc[i]=clt[ctc[i]];
    for(i=1; i<=n; i++)
        printf("%d ", 1-clc[cc[i]]);
    printf("\n");
    return 0;
}