Cod sursa(job #467500)

Utilizator MKLOLDragos Ristache MKLOL Data 29 iunie 2010 02:10:18
Problema Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 kb
#include<stdio.h>

#define Nmax 101000


struct list
{
    int val,c;
    list *next;
} *nod[Nmax];

int N,M,x,y,z,culoare[Nmax],dr=1,coad[Nmax],stop,GLOBALVOID,nrvoid[Nmax];

void adaug(int a,int b,int c)
{
    list *p=new list;
    p->val=b;
    p->c=c;
    p->next=nod[a];
    nod[a]=p;
}
void bfs()
{
    for(int i=0;i<dr&&!stop;++i)
    {
        for(list *p=nod[coad[i]];p!=NULL&&!stop;p=p->next)
        {
            if(culoare[coad[i]]==1) //nodul este in multimea A
            {
                if(p->c==0)
                {
                    if(culoare[p->val]==0||nrvoid[p->val]<GLOBALVOID)
                    {
                        nrvoid[p->val]=GLOBALVOID;
                        culoare[p->val]=2;
                        coad[dr++]=p->val;
                    }
                    if(culoare[p->val]==1)
                        {
                            stop=1;
                        }
                }
                if(p->c==2)
                {
                    if(culoare[p->val]==0||nrvoid[p->val]<GLOBALVOID)
                    {
                        nrvoid[p->val]=GLOBALVOID;
                        culoare[p->val]=1;
                        coad[dr++]=p->val;
                    }
                    if(culoare[p->val]==2)
                        stop=1;
                }


            }
            else if(culoare[coad[i]]==2) //Nodul este in multimea B
            {
                if(p->c==1)
                {
                    if(culoare[p->val]==0||nrvoid[p->val]<GLOBALVOID)
                    {
                        nrvoid[p->val]=GLOBALVOID;
                        culoare[p->val]=1;
                        coad[dr++]=p->val;
                    }
                    if(culoare[p->val]==2)
                        {
                            stop=1;
                        }
                }
                if(p->c==2)
                {
                    if(culoare[p->val]==0||nrvoid[p->val]<GLOBALVOID)
                    {
                        nrvoid[p->val]=GLOBALVOID;

                        culoare[p->val]=2;
                        coad[dr++]=p->val;
                    }
                    if(culoare[p->val]==1)
                        stop=1;
                }
            }

        }

    }
}
int main()
{
    freopen("andrei.in","r",stdin);
    freopen("andrei.out","w",stdout);
    scanf("%d%d",&N,&M);

    for(int i=1;i<=M;++i)
    {
        scanf("%d%d%d",&x,&y,&z);
        adaug(x,y,z);
        adaug(y,x,z);
    }


    for(int i=1;i<=N;++i)
    {
        if(culoare[i]==0)
        {   stop=0;
            culoare[i]=1;
            coad[0]=i;
            dr=1;
            bfs();
        }
        if(stop==1)
        {
            ++GLOBALVOID;
            stop=0;
            culoare[i]=2;
            coad[0]=i;
            dr=1;
            bfs();

        }

    }

    for(int i=1;i<=N;++i)
        printf("%d ",culoare[i]-1);

return 0;
}