Cod sursa(job #467045)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 28 iunie 2010 11:07:57
Problema Andrei Scor 25
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1.82 kb
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;

struct muc
{
    int x;
    char y;
};

vector <muc> v[100006];
char viz[100006],ok,gr[100006];
int n,m;

int verif(int n1,int n2,char stare)
{
    if(stare==2 && gr[n1]!=gr[n2])
        return 0;
    if(!stare && !gr[n1] && !gr[n2])
        return 0;
    if(stare==1 && gr[n1]==1 && gr[n2]==1)
        return 0;
    return 1;
}

void dfs(int nod)
{
    int nn,i,nr=v[nod].size();
    for(i=0;i<nr && ok;i++)
    {
        nn=v[nod][i].x;
        if(viz[nn])
        {
            if(!verif(nn,nod,v[nod][i].y))
                ok=0;
            continue;
        }
        if(v[nod][i].y==2)
        {
            gr[nn]=gr[nod];
            viz[nn]=1;
            dfs(nn);
            continue;
        }
        if(!v[nod][i].y && !gr[nod])
        {
            gr[nn]=1;
            viz[nn]=1;
            dfs(nn);
            continue;
        }
        if(v[nod][i].y==1 && gr[nod]==1)
        {
            gr[nn]=0;
            viz[nn]=1;
            dfs(nn);
        }
    }
}

int main ()
{
    int a,b,c,i;
    muc much;
    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);
        much.x=b;much.y=c;
        v[a].push_back(much);
        much.x=a;
        v[b].push_back(much);
    }
    viz[1]=1;ok=1;
    dfs(1);
    if(ok)
    {
        for(i=1;i<=n;i++)
            if(viz[i])
                printf("%d ",gr[i]);
            else
                printf("0 ");
        printf("\n");
        return 0;
    }
    memset(gr,0,sizeof(gr));
    memset(viz,0,sizeof(viz));
    gr[1]=1;ok=1;viz[1]=1;
    dfs(1);
    for(i=1;i<=n;i++)
        if(viz[i])
            printf("%d ",gr[i]);
        else
            printf("1 ");
    printf("\n");
    return 0;
}