Cod sursa(job #467167)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 28 iunie 2010 12:29:11
Problema Andrei Scor 10
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 2.45 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;
    st[++st[0]]=nod;
    for(long y=0; y<dir[nod].size(); y++)
        df2(dir[nod][y]);
}

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

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++)
    {
        dir[cc[i]].push_back(cc[i]+n);
        dir[cc[i]+n].push_back(cc[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=1; i<=2*nc; i++)
    {
        clt[i]=2;
        if(!f[st[i]])
        {
            nctc++;
            df3(nctc, i);
        }
    }
    for(i=1; i<=st2[0]; i++)
    {
        if(clt[ctc[st2[i]]]==2)
            clt[ctc[st2[i]]]=1;
        for(long y=0; y<dir[st2[i]].size(); y++)
            if(clt[ctc[dir[st2[i]][y]]]==2)
                clt[ctc[dir[st2[i]][y]]]=1-clt[ctc[st2[i]]];
    }
    for(i=1; i<=nc; i++)
        clc[i]=clt[ctc[i]];
    for(i=1; i<=n; i++)
        printf("%d ", clc[cc[i]]);
    printf("\n");
    return 0;
}