Pagini recente » Cod sursa (job #477611) | Cod sursa (job #2650632) | Cod sursa (job #3037471) | Borderou de evaluare (job #2014761) | Cod sursa (job #2881596)
#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;
}