Pagini recente » Cod sursa (job #1009819) | Cod sursa (job #646724) | Cod sursa (job #1307995) | Cod sursa (job #1644124) | Cod sursa (job #467048)
Cod sursa(job #467048)
#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;++i)
{
for(list *p=nod[coad[i]];p!=NULL;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;
}