Pagini recente » Cod sursa (job #1897363) | Cod sursa (job #28835) | Cod sursa (job #2716704) | Cod sursa (job #1321507) | Cod sursa (job #3287149)
#include <fstream>
#include <vector>
#define NMAX 100005
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
int variables, expressions, no_components;
stack<int> s;
vector<int> edges[2 * NMAX], edges1[2 * NMAX];
int components[2 * NMAX];
bitset<2 * NMAX> visited;
vector<int> ans;
int real_idx(int x) {
return x < 0 ? abs(x) + variables : x;
}
void dfs(int node) {
visited[node] = 1;
for (auto child: edges[node])
if (!visited[child])
dfs(child);
s.push(node);
}
void dfs1(int node) {
components[node] = no_components;
for (auto child: edges1[node])
if (components[child] == 0)
dfs1(child);
}
int main() {
f >> variables >> expressions;
for (int i = 1; i <= expressions; i++) {
int x, y;
f >> x >> y;
edges[real_idx(-x)].push_back(real_idx(y));
edges[real_idx(-y)].push_back(real_idx(x));
edges1[real_idx(x)].push_back(real_idx(-y));
edges1[real_idx(y)].push_back(real_idx(-x));
}
for (int i = 1; i <= 2 * variables; i++) {
if (!visited[i]) {
dfs(i);
}
}
while (!s.empty()) {
int node = s.top();
s.pop();
if (!components[node]) {
no_components++;
dfs1(node);
}
}
for (int i = 1; i <= variables; i++) {
if (components[i] == components[i + variables]) {
g << -1;
return 0;
} else {
ans.push_back(components[i] > components[i + variables]);
}
}
for (auto x : ans) g << x << " ";
return 0;
}