Cod sursa(job #467557)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 29 iunie 2010 13:16:34
Problema Andrei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <stdio.h>
#include <vector>
#include <string.h>

using namespace std;

#define maxn 200010

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

void df(long comp, long nod)
{
    if(f[nod])
        return;
    f[nod]=1;
    cc[nod]=comp;
    for(long y=0; y<v[nod].size(); y++)
        df(comp, v[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[i], &b[i], &c[i]);
        if(c[i]==2)
        {
            v[a[i]].push_back(b[i]);
            v[b[i]].push_back(a[i]);
        }
    }
    for(i=1; i<=n; i++)
        if(f[i]==0)
        {
            nc++;
            df(nc, i);
        }
    for(i=1; i<=m; i++)
    {
        if(c[i]==0)
        {
            dir[cc[a[i]]].push_back(cc[b[i]]+nc);
            inv[cc[a[i]]+nc].push_back(cc[b[i]]);
            dir[cc[b[i]]].push_back(cc[a[i]]+nc);
            inv[cc[b[i]]+nc].push_back(cc[a[i]]);
        }
        if(c[i]==1)
        {
            inv[cc[a[i]]].push_back(cc[b[i]]+nc);
            dir[cc[a[i]]+nc].push_back(cc[b[i]]);
            inv[cc[b[i]]].push_back(cc[a[i]]+nc);
            dir[cc[b[i]]+nc].push_back(cc[a[i]]);
        }
    }
    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;
        an=st2[i]+nc;
        if(an>2*nc)
            an-=2*nc;
        if(clt[ctc[an]]==2)
            clt[ctc[an]]=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;
}