Cod sursa(job #2881632)

Utilizator StefanC1234Catiru Stefan StefanC1234 Data 30 martie 2022 18:02:36
Problema 2SAT Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 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; // n numarul de literali, m numarul de clauze, 
bool rez; //iar in vectorul v memorez valorile de adevar
int verif(int i) // Verificare clauza
{
	int a, b;
	a = v[abs(x[i])];
	b = v[abs(y[i])];
	if(x[i] < 0) // daca literalul e negat, neg si valoarea de adevar
		a = !a;
	if(y[i] < 0) // la fel si aici
		b = !b; 
	return a | b;
}
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; // dau valori de adevar aleatoriu celor n literali
	for(i = 0; i < n * 100; ++i) {
		rez = 1;
		for(j = 1; j <= m; ++j) {
		    if(!verif(j))
		    	rez = 0;
			if(!rez) {
				poz = j; // memorez clauza care e falsa
				break;
			}
		}
		if(rez) {
			for(j = 1; j <= n; ++j)
				 fout << v[j] << " "; // returnez valorile de adevar ale literalilor in care formula este satisfiabila
			return 0;
		}
		if(rand() % 2 == 0)
			v[abs(x[poz])] = !v[abs(x[poz])]; // schimb aleatoriu valoarea de adevar ale literalilor din clauza falsa.
		else
			v[abs(y[poz])] = !v[abs(y[poz])];
	}
	fout << "-1\n";
	fin.close();
	fout.close();
	return 0;
}