Pagini recente » Cod sursa (job #3123665) | Cod sursa (job #2881632)
#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;
}