Cod sursa(job #1542324)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 5 decembrie 2015 12:03:50
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<cstring>
using namespace std;

typedef struct celula {
	int nod;
	celula *next;
}*lista;

lista graf[200005],tgraf[200005],v;
int i,j,n,m,x,y,st[400005],stlev,sol[400005];
bool viz[400005], ok;

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

void muchie(int x, int y) {
	 
	 v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
	 v=new celula; v->nod=x; v->next=tgraf[y]; tgraf[y]=v;
	 
}

void dfs(int nod) {
   viz[nod]=1;
   
   for (lista p=graf[nod]; p; p=p->next)
	if (viz[p->nod]==0) dfs(p->nod);
	
   st[++stlev]=nod;
	
}

void dfst(int nod) {
	
	if (ok==0) return;
	
	if (sol[nod]==1) { ok=0; return; }
	
	sol[negat(nod)]=1;
	viz[nod]=1;
	
	for (lista p=tgraf[nod]; p; p=p->next)
	 if (ok&&viz[p->nod]==0) dfst(p->nod);
	
}

int main(void) {
	
	ifstream cin("2sat.in");
	ofstream cout("2sat.out");
	
	cin>>n>>m;
	
	for (i=1; i<=m; ++i) {
		 cin>>x>>y;
		 
		 if (x<0) x=n-x;
		 if (y<0) y=n-y;
		 
		 muchie(negat(x),y);
		 muchie(negat(y),x);
		
	}
	
	for (i=1; i<=2*n; ++i)
	 if (viz[i]==0) dfs(i);
	 
	ok=1;
	memset(viz,0,sizeof(viz));
	
	for (i=stlev; i>=1; --i)
	 if (viz[st[i]]==0 && viz[negat(st[i])]==0) dfst(st[i]);
	 
	if ( !ok ) cout<<"-1";
	else for (i=1; i<=n; ++i) cout<<sol[i]<<" ";
	
	return 0;
}