Cod sursa(job #1550592)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 13 decembrie 2015 23:18:30
Problema 2SAT Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <vector>
#include <deque>
#define MAX 200005
#define neg(x) (((x) <= (n)) ? (x + n) : (x - n))
#define min(a, b) (((a) < (b)) ? (a) : (b))
using namespace std;

int n, m, a, b, val[MAX], viz[MAX];
int index[MAX], lowlink[MAX], ind;
vector<int> l[MAX], c, s;
deque< vector<int> > C;
bool onStack[MAX];

void ctc(int v){
	s.push_back(v);
	onStack[v] = 1;
	index[v] = lowlink[v] = ind++;
	for(int i = 0; i < l[v].size(); i++)
		if(!index[l[v][i]]){
			ctc(l[v][i]);
			lowlink[v] = min(lowlink[v], lowlink[l[v][i]]);
		}
		else
			lowlink[v] = min(lowlink[v], index[l[v][i]]);
	if(lowlink[v] == index[v]){
		int x = 0;
		while(x != v){
			x = s.back();
			s.pop_back();
			onStack[x] = 0;
			c.push_back(x);
		}
		C.push_back(c);
		c.clear();
	}
}

int main(){
	freopen("2sat.in", "r", stdin);
	freopen("2sat.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= 2 * n; i++)
		val[i] = -1;
	for(int i = 0; i < m; i++){
		scanf("%d%d", &a, &b);
		if(a < 0)
			a = n - a;
		if(b < 0)
			b = n - b;
		l[neg(a)].push_back(b);
		l[neg(b)].push_back(a);
	}
	for(int i = 1; i <= 2 * n; i++)
		if(!index[i])
			ctc(i);
	for(int i = 0; i < C.size(); i++)
		for(int j = 0; j < C[i].size(); j++)
			if(viz[C[i][j]] == i && val[neg(C[i][j])] == 1){
				printf("-1\n");
				return 0;
			}
			else if(val[neg(C[i][j])] == -1){
				viz[C[i][j]] = i;
				val[C[i][j]] = 1;
				val[neg(C[i][j])] = 0;
			}
	for(int i = 1; i <= n; i++)
		printf("%d ", val[i]);
	return 0;
}