Pagini recente » Borderou de evaluare (job #2014927) | Cod sursa (job #800654) | Cod sursa (job #2152308) | Cod sursa (job #1348260) | Cod sursa (job #2200429)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("2sat.in");
ofstream g ("2sat.out");
const int Dim = 5e5 + 5;
int ctc[Dim], sortop[Dim];
int n, m, sz;
bool viz[Dim];
vector <int> G[Dim], Gt[Dim];
int idx (int val) {
if (val > 0)
return val;
return n - val;
}
void dfs (int node) {
viz[node] = 1;
for (auto son: G[node]) {
if (viz[son] == 0) {
dfs (son);
}
}
sortop[++sz] = node;
}
void dfs_back (int node, int comp) {
ctc[node] = comp;
viz[node] = 1;
for (auto son: Gt[node]) {
if (viz[son] == 0) {
dfs_back (son, comp);
}
}
}
int main ( ) {
f >> n >> m;
for (int i = 1; i <= m; ++ i) {
int x, y;
f >> x >> y;
G[idx(-x)].push_back (idx(y));
G[idx(-y)].push_back (idx(x));
Gt[idx(y)].push_back (idx(-x));
Gt[idx(x)].push_back (idx(-y));
}
for (int i = 1; i <= 2 * n; ++ i) {
if (!viz[i]) {
dfs (i);
}
}
memset (viz, 0, sizeof(viz));
int comp = 0;
for (int i = 2 * n; i >= 1; -- i) {
if (!viz[sortop[i]]) {
++comp;
dfs_back (sortop[i], comp);
}
}
for (int i = 1; i <= n; ++ i) {
if (ctc[i] == ctc[n + i]) {
g << -1 << '\n';
return 0;
}
}
for (int i = 1; i <= n; ++ i) {
if (ctc[i] < ctc[n + i])
g << 0 << " ";
else
g << 1 << " ";
}
return 0;
}