Cod sursa(job #430129)

Utilizator otilia_sOtilia Stretcu otilia_s Data 30 martie 2010 19:30:16
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 128
#define MMAX 1024
#define pb push_back
int n,m;
int E[MMAX][2];
int sol[NMAX],sol2[NMAX];
int Q[MMAX];
bool viz[NMAX];
vector <int> Ap[NMAX];


void citire()
{
   freopen("party.in","r",stdin);	
   int i,x,y,tip;
   scanf("%d %d",&n,&m);
   for (i=1;i<=m;++i)
   {
	scanf("%d %d %d",&x,&y,&tip);
	switch (tip)
	{
		case 0: {
				 //E[i].pb(mp(x,y));
				 E[i][0]=x; E[i][1]=y;
				 break;
				}
		case 1: {
				 //E[i].pb(mp(x,-y));
				 E[i][0]=x; E[i][1]=-y;
				 break;
				}
		case 2: {
				 //E[i].pb(mp(-x,y));
				 E[i][0]=-x; E[i][1]=y;
				 break;
				}
		case 3: {
				 //E[i].pb(mp(-x,-y));
				 E[i][0]=-x; E[i][1]=-y;
				 break;
				}
	}
	Ap[x].pb(i); Ap[y].pb(i);
	//rez[i][0]=rez[i][1]=0;	
   }
}

inline int ABS(int x)
{
	if (x<0) return -x;
	return x;
}

bool verif_sol(int x)
{
	int st,dr,y,e,px,py,valx,valy,val,i;
	memset(viz,0,sizeof(viz));
	st=dr=0; Q[st]=x;  viz[x]=1;
	while (st<=dr)
   	{
		x=Q[st++]; val=sol2[x];
		for (i=0;i<Ap[x].size();++i)
		{
		 e=Ap[x][i];
		 if (ABS(E[e][0])==x) px=0, py=1; else 
		 if (ABS(E[e][1])==x) px=1, py=0;
		     //else continue;
		 
		 if (E[e][px]<0) valx=!val; else valx=val;
		 if (!valx) //cealalta trebuie sa fie 1
		    {
				if (E[e][py]<0) {valy=0;  y=-E[e][py];}
				   else {valy=1; y=E[e][py];}
				if (sol2[y]==-1) 
				{
					sol2[y]=valy;
					if (!viz[y]) { Q[++dr]=y; viz[y]=1;}					
				} else
				if (sol2[y]!=valy) return 0;
		    }			 
		}
		viz[x]=0;
	}
	return 1;
}

void afisare()
{
	freopen("party.out","w",stdout);
	int i,nr=0;
	for (i=1;i<=n;++i) nr+=sol[i];
	printf("%d\n",nr);
	for (i=1;i<=n;++i)
	 if (sol[i]) printf("%d\n",i);
}

int main()
{
   citire();
   
   int i;
   for (i=1;i<=n;++i) sol[i]=-1;
   
   for (i=1;i<=n;++i)
	if (sol[i]==-1)
		{
			sol[i]=1;
			memcpy(sol2,sol,sizeof(sol));			
			if (verif_sol(i))
				{
					memcpy(sol,sol2,sizeof(sol));
					continue;
				}
			
			sol[i]=0;
			memcpy(sol2,sol,sizeof(sol));			
			if (verif_sol(i))
				{
					memcpy(sol,sol2,sizeof(sol));
					continue;
				}			
		}
   
	afisare();
	
   return 0;	
}