Pagini recente » Cod sursa (job #2764077) | Cod sursa (job #1183902) | Cod sursa (job #3166620) | Cod sursa (job #653327) | Cod sursa (job #3143052)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
const int N = 2e5+5;
vector<int> g[N], g1[N];
bool ans[N];
bool vis[N];
vector<int> order;
void dfs1(int v) {
vis[v] = true;
for (int u : g[v]) {
if (!vis[u]) dfs1(u);
}
order.push_back(v);
}
int curr=0;
int ctc[N];
void dfs2(int v) {
ctc[v] = curr;
for (int u : g1[v]) {
if (!ctc[u]) dfs2(u);
}
}
int main() {
int n, m;
fin>>n>>m;
for (int i=0; i<m; ++i) {
int a, b;
fin>>a>>b;
if (a<0) a = -2*a-1;
else a = 2*a;
if (b<0) b = -2*b-1;
else b = 2*b;
g[a + (a&1 ? 1 : -1)].push_back(b);
g[b + (b&1 ? 1 : -1)].push_back(a);
}
for (int i=1; i<=2*n; ++i) {
for (int j : g[i]) g1[j].push_back(i);
}
for (int i=1; i<=2*n; ++i) {
if (!vis[i]) dfs1(i);
}
reverse(order.begin(), order.end());
for (int v : order) {
if (!ctc[v]) {
++curr;
dfs2(v);
}
}
bool ok = true;
for (int i=1; i<=n; ++i) {
ok &= (ctc[2*i] != ctc[2*i-1]);
}
if (!ok) {
fout<<"-1";
return 0;
}
for (int i=1; i<=n; ++i) {
if (ctc[2*i] > ctc[2*i-1]) ans[i] = 1;
fout<<ans[i]<<" ";
}
}