Cod sursa(job #384536)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 20 ianuarie 2010 12:55:42
Problema 2SAT Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>
#include<vector>
#include<string.h>
#define nmax 2005
using namespace std;
int n,m,st[nmax],viz[nmax],sol[nmax];
vector<int> v[nmax],vt[nmax];

inline int neg(int x){return x>n?x-n:x+n;}

void dfs(int x)
{
	int i,lim=v[x].size();
	viz[x]=1;
	for(i=0;i<lim;i++)
		if(!viz[v[x][i]])
			dfs(v[x][i]);
	st[++st[0]]=x;
}

void dfs2(int x)
{
	int i,lim=vt[x].size();
	viz[x]=1;
	sol[neg(x)]=1;
	for(i=0;i<lim;i++)
		if(!viz[vt[x][i]])
			dfs2(vt[x][i]);
}

int main()
{
	freopen("2sat.in","r",stdin);
	freopen("2sat.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i,a,b;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		if(a<0)
			a=n+(-a);
		if(b<0)
			b=n+(-b);
		v[neg(a)].push_back(b);
		vt[a].push_back(neg(b));
		v[neg(b)].push_back(a);
		vt[b].push_back(neg(a));
	}
	for(i=1;i<=2*n;i++)
		if(!viz[i])
			dfs(i);
	memset(viz,0,sizeof(viz));
	for(i=2*n;i>=1;i--)
		if(!viz[st[i]] && !viz[neg(st[i])])
			dfs2(st[i]);
	for(i=1;i<=n;i++)
		if(sol[i]==sol[neg(i)])
		{
			printf("-1\n");
			return 0;
		}
	for(i=1;i<=n;i++)
		printf("%d ",sol[i]);
	return 0;
}