Cod sursa(job #2881596)

Utilizator duca_alinaDuca Alina duca_alina Data 30 martie 2022 17:11:16
Problema 2SAT Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <ctime>
#include <cmath>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int n, m, x[100000], y[100000], v[100000], poz;
bool rez;
int verif(int i)  //verificare clauza
{
	int a, b;
	a = v[abs(x[i])];      //(x1 sau x2) si (not x3 sau x4)
	b = v[abs(y[i])];       //x[1] = 1, y[1] = 2
	if(x[i] < 0)        //x[2] = -3, y[2] = 4
		a = !a;         //v[1] = 1, v[2] = 1, v[3] = 0, v[4] = 0  => o tau-atribuire posibila pentru literali.
	if(y[i] < 0)
		b = !b; 
	return a | b;		
}

int ok()
{
	for(int i = 1; i <= m; ++i)
		 if(!verif(i))
			 return 0;
    return 1;
}

int main()
{
	int i, j;
	fin >> n >> m;
	for(i = 1; i <= m; ++i)
	    fin >> x[i] >> y[i];
	srand(time(0));
	for(i = 1; i <= n; ++i)
		 v[i] = rand() % 2;
	for(i = 0; i < n * 100; ++i) {
		rez = 1;
		for(j = 1; j <= m; ++j) {
		    if(!verif(j))
		        rez = 0;
			if(!rez) {
				poz = j;
				break;
			}
		}
		if(rez) {
			for(j = 1; j <= n; ++j)
				 fout << v[j] << " ";
			return 0;
		}
		if(rand() % 2 == 0)
			v[abs(x[poz])] = !v[abs(x[poz])];
		else
			v[abs(y[poz])] = !v[abs(y[poz])];//(x1 sau x2) si (not x1 sau not x2) si (not x1 sau x2) si (x1 sau not x2)
	}
	fout << "-1\n";
	fin.close();
	fout.close();
	return 0;
}