Pagini recente » Cod sursa (job #622737) | Cod sursa (job #717748) | Cod sursa (job #1582313) | Cod sursa (job #322200) | Cod sursa (job #2293839)
//
// 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] << ' ';
}