Cod sursa(job #382685)

Utilizator CezarMocanCezar Mocan CezarMocan Data 14 ianuarie 2010 13:07:07
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define MAXN 3100
#define MAXM 100100

using namespace std;

int N, M;
pair <int, int> EXPR[MAXM];
int SOL[MAXN], SOL_PR[MAXN];
vector <int> G[MAXN], CT[MAXN];

bool eval_term(pair <int, int> T, int STACK[]) {
    int x, y;
    
    x = STACK[abs(T.first)];
    y = STACK[abs(T.second)];
    
    if (T.first < 0)
        x ^= 1;
    if (T.second < 0)
        y ^= 1;
        
    return (x | y);
}


inline bool ok_sol(int T) {
	int Q[MAXN], p, u, i, punQ;
	int VIZ[MAXN];
	int x, y, nE;
	
	memset(VIZ, 0, sizeof(VIZ));

	p = u = 1;
	Q[p] = T;
	VIZ[T] = 1;
	
	while (p <= u) {
		x = Q[p];
		
		for (i = 0; i < G[x].size(); i++) {
			y = abs(G[x][i]);
			nE = CT[x][i];
			
			if (VIZ[y] == 0) {
				
				int ant = SOL_PR[y];
				int punQ = 0;				
				SOL_PR[y] = 0;
				if (!eval_term(EXPR[nE], SOL_PR))
					punQ = 1;
				
				SOL_PR[y] = 1;
				if (!eval_term(EXPR[nE], SOL_PR))
					punQ = 1;

				if (punQ) {
					SOL_PR[y] = 0;
					if (!eval_term(EXPR[nE], SOL_PR))
						SOL_PR[y] = 1;
				
					Q[++u] = y;
					VIZ[y] = 1;
				}
				else
					SOL_PR[y] = ant;
			}
			else {
				if (!eval_term(EXPR[nE], SOL_PR))
					return false;
			}
		}
		
		p++;
	}
	
	return true;
}

int main() {
	
	int i, j, a, b;
	
	freopen("2sat.in", "r", stdin);
	freopen("2sat.out", "w", stdout);
	
	scanf("%d%d", &N, &M);
	for (i = 1; i <= M; i++) {
		scanf("%d%d", &a, &b);
		EXPR[i] = make_pair(a, b);
		G[abs(a)].push_back(b); G[abs(b)].push_back(a);
		CT[abs(a)].push_back(i); CT[abs(b)].push_back(i);
	}
	
	memset(SOL, -1, sizeof(SOL));
	
	for (i = 1; i <= N; i++) {
		if (SOL[i] == -1) {
			SOL[i] = 0;
			memcpy(SOL_PR, SOL, sizeof(SOL));
			if (ok_sol(i)) 
				memcpy(SOL, SOL_PR, sizeof(SOL));
			else {
				SOL[i] = 1;
				memcpy(SOL_PR, SOL, sizeof(SOL));
				if (ok_sol(i))
					memcpy(SOL, SOL_PR, sizeof(SOL));
				else {
					printf("-1\n");
					return 0;
				}
			}
		}
		else {
			memcpy(SOL_PR, SOL, sizeof(SOL));
			if (ok_sol(i))
				memcpy(SOL, SOL_PR, sizeof(SOL));
			else {
				SOL[i] ^= 1;
				if (ok_sol(i))
					memcpy(SOL, SOL_PR, sizeof(SOL));
				else {
					printf("-1\n");
					return 0;
				}
				
			}
		}
	}

/*	printf("1\n");
	return 0;*/

	for (i = 1; i <= N; i++)
		printf("%d ", SOL[i]);
	
	return 0;
}