Cod sursa(job #592682)

Utilizator indestructiblecont de teste indestructible Data 29 mai 2011 21:30:36
Problema Andrei Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <stdio.h>
#include <vector>
#define NMAX 100005
#define pb push_back
using namespace std;
int n,m;
vector <int> alb[NMAX],negru[NMAX],violet[NMAX];
char sol[NMAX],marc[NMAX],ok;
void read()
{
	scanf("%d%d",&n,&m);
	int i,x,y,z;
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		if (z==0)
		{
			alb[x].pb(y);
			alb[y].pb(x);
		}
		if (z==1)
		{
			negru[x].pb(y);
			negru[y].pb(x);
		}
		if (z==2)
		{
			violet[x].pb(y);
			violet[y].pb(x);
		}
	}
}
void dfs(int nod)
{
	if (!ok)
		return ;
	int i,vec;
	if (sol[nod]==0)
	{
		for (i=0; i<alb[nod].size(); i++)
		{
			vec=alb[nod][i];
			if (marc[vec] && sol[vec]==0)
			{
				ok=0;
				return ;
			}
			if (!marc[vec])
			{
				sol[vec]=1; marc[vec]=1;
				dfs(vec);
				if (!ok)
					marc[vec]=0;
			}
		}
		for (i=0; i<violet[nod].size(); i++)
		{
			vec=violet[nod][i];
			if (marc[vec] && sol[vec]!=sol[nod])
			{
				ok=0;
				return ;
			}
			if (!marc[vec])
			{
				sol[vec]=sol[nod]; marc[vec]=1;
				dfs(vec);
				if (!ok)
					marc[vec]=0;
			}
		}
	}
	
	if (sol[nod]==1)
	{
		for (i=0; i<negru[nod].size(); i++)
		{
			vec=negru[nod][i];
			if (marc[vec] && sol[vec]==1)
			{
				ok=0;
				return ;
			}
			if (!marc[vec])
			{
				sol[vec]=0; marc[vec]=1;
				dfs(vec);
				if (!ok)
					marc[vec]=0;
			}
		}
		for (i=0; i<violet[nod].size(); i++)
		{
			vec=violet[nod][i];
			if (marc[vec] && sol[vec]!=sol[nod])
			{
				ok=0;
				return ;
			}
			if (!marc[vec])
			{
				sol[vec]=sol[nod]; marc[vec]=1;
				dfs(vec);
				if (!ok)
					marc[vec]=0;
			}
		}
	}
}
void solve()
{
	int i;
	for (i=1; i<=n; i++)
		if (!marc[i])
		{
			marc[i]=1;
			sol[i]=0; //i e in A
			ok=1; 
			dfs(i);
			if (!ok)
			{
				sol[i]=1; //i e in B
				dfs(i);
			}
		}
	for (i=1; i<=n; i++)
		printf("%d ",sol[i]);
	printf("\n");
}
int main()
{
	freopen("andrei.in","r",stdin);
	freopen("andrei.out","w",stdout);
	read();
	solve();
	return 0;
}