Cod sursa(job #2293826)

Utilizator Raoul_16Raoul Bocancea Raoul_16 Data 1 decembrie 2018 17:00:55
Problema 2SAT Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
//
//  2SAT.cpp
//  
//
//  Created by Raoul Bocancea on 01/12/2018.
//

#include <fstream>
#include <ctime>

const std :: string programName = "2sat";
std :: ifstream f(programName + ".in");
std :: ofstream g(programName + ".out");

const int NMAX = 1E5, MMAX = 2E5;

int N, M, sol[NMAX + 5];

std :: pair <int, int> expression[MMAX + 5];

bool solvable(std :: pair <int, int>);
void read(void), generate(void), calculate_and_print(void), print(void);

int main(void) {
    read();
    generate();
    calculate_and_print();
    return 0x0;
}

void read(void) {
    f >> N >> M;
    for (int i = 1; i <= M; ++i) {
        int a, b;
        f >> a >> b;
        expression[i] = std :: make_pair(a, b);
    }
}

void generate(void) {
    srand(time(0));
    for (int i = 1; i <= N; ++i)
        sol[i] = rand() % 2;
}

void calculate_and_print(void) {
    for (int step = 0; step <= N * 20; ++step) {
        int current_result = 1, Xcopy;;
        for (int i = 1; i <= M; ++i) {
            current_result &= solvable(expression[i]);
            if (current_result == 0) {
                Xcopy = i;
                break;
            }
        }
        if (current_result == 1) {
            print();
            return;
        }
        
        if (rand() % 2 == 0)
            sol[abs(expression[Xcopy].first)] ^= 1;
        else
            sol[abs(expression[Xcopy].second)] ^= 1;
    }
}

bool solvable(std :: pair <int , int > Temp) {
    int first, second;
    
    Temp.first < 0 ? first = sol[-Temp.first] : first = sol[Temp.first];
    Temp.second < 0 ? second = sol[-Temp.second] : second = sol[Temp.second];
    
    if (Temp.first < 0)
        first ^= 1;
    
    if (Temp.second < 0)
        second ^= 1;
    
    return (first | second);
}

void print(void) {
    for (int i = 1; i <= N; ++i)
        g << sol[i] << ' ';
}