Cod sursa(job #201215)

Utilizator devilkindSavin Tiberiu devilkind Data 29 iulie 2008 17:27:50
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define NMAX 256
#define pb push_back
#define sz size()
#define mp make_pair
#define ff first
#define ss second

vector<int> G[NMAX],TC[NMAX];
int GR[NMAX],INV[NMAX],AP[NMAX],ST[NMAX];
int n,m,K;
int viz[NMAX],uz[NMAX];
int cd[NMAX];
int poz[NMAX];

inline int neg(int x)
{
	if (x>n) return x-K;
	return x+K;
}

void DF(int nod)
{
	viz[nod]=1;
	
	for (int i=0;i<G[nod].sz;i++)
		if (!viz[ G[nod][i] ]) DF( G[nod][i] );
}

int main()
{
	freopen("party.in","r",stdin);
	freopen("party.out","w",stdout);
	
	int i,j,x,y,z,a,b,c,d,nod;

	scanf("%d %d",&n,&m);
	K=n;

	for (i=1;i<=m;i++)
	{
		scanf("%d %d %d",&x,&y,&z);

		if (z==0) 
		{
			a=neg(x);b=neg(y);
			c=y;d=x;
		}

		if (z==2) swap(x,y);

		if ( (z==1) || (z==2) ) 
		{
			a=neg(x);b=y;
			c=neg(y);d=x;
		}

		if (z==3)
		{
			a=y;b=x;
			c=neg(x);d=neg(y);			
		}

		G[a].pb(c);
		G[b].pb(d);
	}

	int nr=0;

	n*=2;
	for (i=1;i<=n;i++)
		if (AP[i]==0)
		{
			AP[i]=++nr;
			memset(viz,0,sizeof(viz));
			DF(i);
			
			for (j=1;j<=n;j++)
				uz[j]=viz[j];

			for (j=1;j<=n;j++)
				if (uz[j])
				{
					memset(viz,0,sizeof(viz));
					DF(j);
					if (viz[i]) AP[j]=AP[i];
				}
		}
	
	for (i=1;i<=n;i++)
	{
		x=AP[i];
		for (j=0;j<G[i].sz;j++) 
		{
			a=G[i][j];
			if ( AP[a]==x ) continue; 
			GR[ AP[a] ]++;
			TC[x].pb( AP[a] );
		}
		INV[ AP[i] ] = AP[ neg(i) ];
	}

	for (i=1;i<=nr;i++) 
		if (!GR[i]) cd[ ++cd[0] ] = i;

	for (i=1;i<=cd[0];i++)
	{
		nod=cd[i];
		poz[nod]=i;
		for (j=0;j<TC[nod].sz;j++)
		{
			GR[ TC[nod][j] ]--;
			if ( !GR[ TC[nod][j] ] ) cd[ ++cd[0] ] = TC[nod][j];
		}
	}


	vector<int> sol;

//	for (i=1;i<=n;i++) printf("%d ",AP[i]);

	for (i=1;i<=n/2;i++)
	{
//		printf("%d %d\n",poz[ AP[i] ], poz[ AP[neg(i)] ]);
		if ( poz[ AP[i] ]>poz[ AP[ neg(i) ] ]) sol.pb(i);
	}

	printf("%d\n",sol.sz);
	for (i=0;i<sol.sz;i++)
		printf("%d\n",sol[i]);
	return 0;
}