Pagini recente » Cod sursa (job #2593865) | Cod sursa (job #2762561) | Cod sursa (job #2828496) | Cod sursa (job #398563) | Cod sursa (job #2285978)
#include <bits/stdc++.h>
using namespace std;
/// X will become the node 2 * x, -x will become 2 * x + 1
namespace SAT {
vector <vector <int>> adia, adiaback;
vector <int> id, viz, sortop;
void add_clause(int x, int y) {
x *= 2, y *= 2;
if (x < 0)
x = (-x) ^ 1;
if (y < 0)
y = (-y) ^ 1;
adia[x ^ 1].push_back(y);
adia[y ^ 1].push_back(x);
adiaback[x].push_back(y ^ 1);
adiaback[y].push_back(x ^ 1);
}
void add_var(int nr = 1) {
while (nr--) {
adia.push_back(vector <int>());
adia.push_back(vector <int>());
adiaback.push_back(vector <int>());
adiaback.push_back(vector <int>());
id.push_back(0);
viz.push_back(0);
id.push_back(0);
viz.push_back(0);
}
}
void dfs(int nod) {
viz[nod] = 1;
for (auto i : adia[nod])
if (!viz[i])
dfs(i);
sortop.push_back(nod);
}
void dfsback(int nod, int c) {
id[nod] = c;
for (auto i : adiaback[nod])
if (!id[i])
dfsback(i, c);
}
bool is_solvable() {
int n = adia.size();
for (int i = 0; i < n; i++)
if (!viz[i])
dfs(i);
reverse(sortop.begin(), sortop.end());
int cnt = 0;
for (auto i : sortop)
if (!id[i])
dfsback(i, ++cnt);
for (int i = 0; i < n; i++)
if (id[i] == id[i ^ 1])
return false;
return true;
}
}
int main()
{
ifstream in("2sat.in");
ofstream out("2sat.out");
int n, m;
in >> n >> m;
SAT::add_var(n + 1);
while (m--) {
int a, b;
in >> a >> b;
SAT::add_clause(a, b);
}
if (!SAT::is_solvable())
return out << "-1\n", 0;
for (int i = 1; i <= n; i++)
out << (SAT::id[2 * i] > SAT::id[2 * i + 1]) << ' ';
return 0;
}