Cod sursa(job #477094)

Utilizator S7012MYPetru Trimbitas S7012MY Data 13 august 2010 13:20:39
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#define DM 400005

int n,m,sol[DM],ord[DM],nr;
bool viz[DM],ok=true;

struct nod {
	int x;
	nod *urm;
} *g[DM],*gt[DM];

inline int non(int a) {
	return (a>n) ? a-n: n+a;
}

void dfs(int sursa) {
	if(viz[sursa]) return;
	nod *p;
	viz[sursa]=true;
	for(p=g[sursa]; p!=NULL; p=p->urm) 
		if(!viz[p->x]) dfs(p->x);
	ord[++nr]=sursa;
}

void dfs_2(int sursa) {
	if(!viz[sursa]) return;
	nod *p;
	viz[sursa]=false;
	if(sol[sursa]) ok=false;//nu avem solutie
	sol[non(sursa)]=1;
	for(p=gt[sursa]; p!=NULL; p=p->urm)
		if(viz[p->x]) dfs_2(p->x);
}

void adaugare(int x,int y,bool a) {
	nod *p;
	p=new nod;
	p->x=y;
	if(a) {
		p->urm=g[x];
		g[x]=p;
	}else {
		p->urm=gt[x];
		gt[x]=p;
	}
}

int main()
{
	int i,x,y;
	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);
		x=(x<0)?n-x:x;
		y=(y<0)?n-y:y;
		adaugare(non(x),y,true);
		adaugare(non(y),x,true);
		adaugare(x,non(y),false);
		adaugare(y,non(x),false);
	}
	
	for(i=1; i<=n+n; ++i)
		if(!viz[i]) dfs(i);
	for(i=n+n;i;--i)
		if(viz[ord[i]] && viz[non(ord[i])])
			dfs_2(ord[i]);
	if(!ok) printf("-1");
	else for(i=1; i<=n; ++i) printf("%d ",sol[i]);
	return 0;
}