Cod sursa(job #467419)

Utilizator hadesgamesTache Alexandru hadesgames Data 28 iunie 2010 20:55:11
Problema Andrei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include<cstdio>
#include <vector>
using namespace std;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
FILE *in,*out;
vector<int> c,a[200005],b[200005],componenta[200005];
int v[200005],grupa[200005],nr,nrin[200005],rez[200005],n,q[200005];
void dfs(int x)
{
	int i;
	v[x]=1;
	for (i=0;i<a[x].size();i++)
		if (!v[a[x][i]])
			dfs(a[x][i]);
	c.pb(x);
}
void dfs_tare(int x)
{
	int i;
	componenta[nr].pb(x);
	grupa[x]=nr;
	for (i=0;i<b[x].size();i++)
		if (!grupa[b[x][i]])
			dfs_tare(b[x][i]);
}
inline int id(int x)
{
	return (x<0)?-x+n:x;
}
inline int non(int x)
{
	return x<=n?x+n:x-n;
}
inline int val(int x)
{
	return x<=n?x:x-n;
}
inline int semn(int x)
{
	return x>n?1:0;
}
int addmuchie(int x,int y)
{
		a[non(id(x))].pb(id(y));
		b[id(y)].pb(non(id(x)));
		a[non(id(y))].pb(id(x));
		b[id(x)].pb(non(id(y)));
}
int main()
{
	int m,x,y,i,j,k,p,u,nr2=0,z;
	in=fopen("andrei.in","r");
	out=fopen("andrei.out","w");
	fscanf(in,"%d%d",&n,&m);
	for (i=1;i<=m;i++)
	{
		fscanf(in,"%d%d%d",&x,&y,&z);
		if (z==0)
			addmuchie(x,y);
		if (z==1)
			addmuchie(-x,-y);
		if (z==2)
		{
			addmuchie(x,-y);
			addmuchie(-x,y);
		}
	}
	for (i=1;i<=n;i++)
		rez[i]=-1;
	for (i=1;i<=(n<<1);i++)
		if (!v[i])
			dfs(i);
	for (i=c.size()-1;i>=0;i--)
		if (!grupa[c[i]])
		{
			nr++;
			dfs_tare(c[i]);
		}
/*	for (i=1;i<=n;i++)
		if (grupa[i]==grupa[i+n])
		{
			fprintf(out,"-1\n");
			fclose(in);
			fclose(out);
			return 0;
		}*/
	for (i=1;i<=nr;i++)
		for (j=0;j<componenta[i].size();j++)
			for (k=0;k<a[componenta[i][j]].size();k++)
				if (grupa[componenta[i][j]]!=grupa[a[componenta[i][j]][k]])
				{
					nrin[grupa[a[componenta[i][j]][k]]]++;
				}
	p=1;
	u=0;
	for (i=1;i<=nr;i++)
		if (nrin[i]==0)
		{
			u++;
			q[u]=i;
		}
	while (p<=u)
	{
		for (i=0;i<componenta[q[p]].size();i++)
		{
			if (rez[val(componenta[q[p]][i])]==-1)
				rez[val(componenta[q[p]][i])]=semn(componenta[q[p]][i]);
			for (j=0;j<a[componenta[q[p]][i]].size();j++)
			{
				if (grupa[a[componenta[q[p]][i]][j]]!=grupa[componenta[q[p]][i]])
				{
					nrin[grupa[a[componenta[q[p]][i]][j]]]--;
					if (nrin[grupa[a[componenta[q[p]][i]][j]]]==0)
					{
						u++;
						q[u]=grupa[a[componenta[q[p]][i]][j]];
					}
				}
			}
		}
		p++;	
	}
	for (i=1;i<=n;i++)
		fprintf(out,"%d ",rez[i]);
	fprintf(out,"\n");
	fclose(in);
	fclose(out);
	return 0;
}