Cod sursa(job #588952)

Utilizator drywaterLazar Vlad drywater Data 10 mai 2011 10:34:18
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <stdio.h>
#include <vector>
using namespace std;
int q[200001],val[100001],st[200001],dim[200001],n,m,idx[200001],low[200001],index,i,x,y,luat[200001],gr[200001],ctc[200001];
vector <int> G[200001],scc;
vector < vector <int> > sccs;
inline int non(int a)
{
	if (a>0) return a+n;
	else return ((-1)*a);
}
inline int abs(int a)
{
	if (a>0) return a;
	else return ((-1)*a+n);
}
int caut(int vf)
{
	idx[vf]=index;
	low[vf]=index;
	st[++st[0]]=vf;
	luat[vf]=1;
	index++;
	int a;
	for (a=0;a<dim[vf];a++)
	{
		if (luat[G[vf][a]])
		{
			if (low[G[vf][a]]<low[vf]) low[vf]=low[G[vf][a]];
		}
		else if (idx[G[vf][a]]<0) {caut(G[vf][a]); if (low[G[vf][a]]<low[vf]) low[vf]=low[G[vf][a]];}
	}
	if (idx[vf]==low[vf])
	{
		ctc[0]++;
		scc.clear();
		do
		{
			ctc[st[st[0]]]=ctc[0];
			scc.push_back(st[st[0]]);
			luat[st[st[0]]]=0;
			st[0]--;
		}while (st[st[0]+1]!=vf);
		sccs.push_back(scc);
	}
	return 0;
}
int main(void)
{
	freopen("2sat.in","r",stdin);
	freopen("2sat.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		G[non(x)].push_back(abs(y));
		G[non(y)].push_back(abs(x));
	}
	for (i=1;i<=2*n;i++)
	{
		val[i]=-1;
		idx[i]=-1;
		low[i]=-1;
		dim[i]=G[i].size();
		ctc[i]=0;
	}
	index=1;
	for (i=1;i<=2*n;i++)
		if (!ctc[i]) caut(i);
	int ok=1;
	for (i=1;i<=n && ok;i++)
		if (ctc[i]==ctc[n+i]) ok=0;
	if (!ok) {printf("-1\n"); return 0;}
	for (i=1;i<=2*n;i++)
	{
		for (int j=0;j<dim[i];j++)
			if (ctc[G[i][j]]!=ctc[i]) gr[ctc[G[i][j]]]++;
	}
	for (i=1;i<=ctc[0];i++)
		if (gr[i]==0) q[++q[0]]=i;
	i=1;
	while (i<=q[0])
	{
		q[i]--;
		int l=sccs[q[i]].size();
		for (int j=0;j<l;j++)
		{
			int x=sccs[q[i]][j];
			if (x>n) x-=n;
			if (val[x]==-1)
			if (sccs[q[i]][j]<=n) val[x]=0; else val[x]=1;
			for (int k=0;k<dim[sccs[q[i]][j]];k++)
			{
				gr[ctc[G[sccs[q[i]][j]][k]]]--; 
				if (gr[ctc[G[sccs[q[i]][j]][k]]]==0) q[++q[0]]=ctc[G[sccs[q[i]][j]][k]];}
		}
		i++;
	}
	for (i=1;i<=n;i++)
		printf("%d ",val[i]);
	printf("\n");
	return 0;	
}