Cod sursa(job #1552917)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 18 decembrie 2015 22:21:24
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 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], root[MAX], nr;
vector<int> Gout[MAX], Gin[MAX], L, G[MAX];
bool viz[MAX];

void dfs(int u){
	viz[u] = 1;
	for(int i = 0; i < Gout[u].size(); i++)
		if(!viz[Gout[u][i]])
			dfs(Gout[u][i]);
	L.push_back(u);
}

void dfsBack(int u, int r){
	root[u] = r;
	for(int i = 0; i < Gin[u].size(); i++)
		if(!root[Gin[u][i]])
			dfsBack(Gin[u][i], r);
}
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;
		Gout[neg(a)].push_back(b);
		Gout[neg(b)].push_back(a);
		Gin[b].push_back(neg(a));
		Gin[a].push_back(neg(b));
	}

	for(int i = 1; i <= 2 * n; i++)
		if(!viz[i])
			dfs(i);
	for(; L.size(); L.pop_back())
		if(!root[L.back()])
			dfsBack(L.back(), ++nr);
	for(int i = 1; i <= 2 * n; i++)
		G[root[i]].push_back(i);

	for(int i = 1; i <= nr; i++)
		for(int j = 0; j < G[i].size(); j++)
			if(root[neg(G[i][j])] == i && val[neg(G[i][j])] == 0){
				printf("-1\n");
				return 0;
			}
			else if(val[neg(G[i][j])] == -1){
				val[G[i][j]] = 0;
				val[neg(G[i][j])] = 1;
			}
	for(int i = 1; i <= n; i++)
		printf("%d ", val[i]);
	printf("\n");
	return 0;
}