Cod sursa(job #2239048)

Utilizator mariusn01Marius Nicoli mariusn01 Data 8 septembrie 2018 19:17:15
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
/// numarul de ecuatii, numarul de necunoscute, numarul de termeni
#include <fstream>
#define MAX_NECUTOSCUTE 100000
#define MAX_ECUATII 100000
#define MAX_DIMENSIUNE 100000

using namespace std;

ifstream fin ("2sat.in");
ofstream fout("2sat.out");

int A[MAX_ECUATII][MAX_DIMENSIUNE];
int x[MAX_NECUTOSCUTE];

int solutie, ecuatii, necunoscute, dimensiune;

void backtrack(int pas) {
    if (solutie)
        return;
    if (pas > necunoscute) {

        for (int i=1; i<=ecuatii; i++) {
            int ok = 0;
            for (int j=1; j<=dimensiune; j++) {
                if (A[i][j] > 0 && x[ A[i][j] ] == 1) {
                    ok = 1;
                    break;
                }
                if (A[i][j] < 0 && x[ -A[i][j] ] == 0) {
                    ok = 1;
                    break;
                }
            }
            if (ok == 0)
                return;
        }

        solutie = 1;
        ///fout<<"DA\n";
        for (int k=1;k<=necunoscute;k++)
            fout<<x[k]<<" ";
        fout<<"\n";
        return;
    } else {
        for (int i=0; i<=1; i++) {
            x[pas] = i;
            backtrack(pas+1);
        }
    }
}

int main () {
    fin>>necunoscute>>ecuatii;
    dimensiune = 2;
    for (int i=1; i<=ecuatii; i++) {
        for (int j=1; j<=dimensiune; j++) {
            fin>>A[i][j];
        }
    }
    solutie = 0;
    backtrack(1);
    if (!solutie) {
        fout<<"-1\n";
    }
    return 0;
}