Cod sursa(job #430567)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 31 martie 2010 10:12:24
Problema 2SAT Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include<stdio.h>
#include<vector>
#include<stack>
#define Nmax 200010
using namespace std;

int i,n,m,ctc[Nmax],ST[Nmax],lowlink[Nmax],Index[Nmax],viz[Nmax],idx,sol[Nmax],nn,M,TC,x,y;
vector<int> G[Nmax],Ctc[Nmax];
stack<int> S;


int non (int x)
{
	if( x <= n) return x+n;
	return x-n;
}

void tarjan(int nod)
{
	viz[nod]=1;
	lowlink[nod]=idx;
	Index[nod]=idx;
	idx++;
	
	S.push(nod);
	
	int i,fiu,N=G[nod].size();
	
	for(i=0;i<N;i++)
	{
		fiu=G[nod][i];
		
		if(!Index[fiu])
		{
			tarjan(fiu);
			if(lowlink[fiu]<lowlink[nod]) lowlink[nod]=lowlink[fiu];
		}
		else if(viz[fiu])
				if(lowlink[fiu]<lowlink[nod]) lowlink[nod]=lowlink[fiu];
	}
	
	if(Index[nod]==lowlink[nod])
	{
		TC++;
		do
		{
			N=S.top();
			S.pop();
			Ctc[TC].push_back(N);
			viz[N]=0;
			ctc[N]=TC;
		}
		while(N!=nod);
	}
}

void sortaret (int C)
{
	viz[C]=1;
	int N=Ctc[C].size(),i,j,nod,fiu,mSize;
	
	for(i=0;i<N;i++)
	{
		nod=Ctc[C][i];
		mSize=G[nod].size();
		
		for(j=0;j<mSize;j++)
		{
			fiu=G[nod][j];
			if(ctc[nod]!=ctc[fiu] && !viz[ctc[fiu]])
				sortaret(ctc[fiu]);
		}
	}
	
	ST[M--]=C;
}

void atribuie (int C)
{
	viz[C]=0;
	
	int N=Ctc[C].size(),i,fiu;
	
	for(i=0;i<N;i++)
	{
		fiu=Ctc[C][i];
		sol[fiu]=0;
		sol[non(fiu)]=1;
		viz[ctc[non(fiu)]]=0;
	}
}

int main()
{
	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);
		
		if(x<0) x=non(-x);
		if(y<0) y=non(-y);
		
		G[non(x)].push_back(y);
		G[non(y)].push_back(x);
	}
	
	nn=n<<1;
	
	for(i=1;i<=nn;i++)
		if(!Index[i]) tarjan(i);
	
	for(i=1;i<=n;i++)
		if(ctc[i]==ctc[non(i)]) {printf("-1"); return 0;}

	M=TC;	
	for(i=1;i<=TC;i++)
		if(!viz[i]) sortaret(i);
	
	for(i=1;i<=TC;i++)
		if(viz[ST[i]])
			atribuie(ST[i]);
		
	for(i=1;i<=n;i++)	
		printf("%d ",sol[i]);
	
	return 0;
}