Pagini recente » Monitorul de evaluare | Cod sursa (job #2538890) | Cod sursa (job #1176708) | Cod sursa (job #3292379) | Cod sursa (job #3201005)
#include <bits/stdc++.h>
using namespace std;
const char nl = '\n';
const char sp = ' ';
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const char out[2][4]{ "No", "Yes" };
#define all(a) a.begin(), a.end()
using ll = long long;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
/*
A or B = true
A | B | A or B
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 1
!A -> B
!B -> A
A B C D
!A OR !B
B OR !C
B OR C
!B OR !D
C OR D
*/
const int nmax = 1e5;
int n, m;
vector<int> g[2 * nmax + 5];
vector<int> gt[2 * nmax + 5];
bool vis[2 * nmax + 5]{ 0 };
vector<int> order;
int scc[2 * nmax + 5]{ 0 }, k = 0;
bool color[2 * nmax + 5]{ 0 };
void dfs1(int u) {
vis[u] = true;
for (auto& v : g[u]) {
if (!vis[v]) {
dfs1(v);
}
}
order.push_back(u);
}
void dfs2(int u) {
vis[u] = true;
for (auto& v : gt[u]) {
if (!vis[v]) {
scc[v] = scc[u];
dfs2(v);
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
fin >> n >> m;
while (m--) {
int u, v;
fin >> u >> v;
if (u < 0) {
u = n - u;
}
if (v < 0) {
v = n - v;
}
int uu = (u - 1) % n + 1;
int vv = (v - 1) % n + 1;
g[2 * uu + n - u].push_back(v);
gt[v].push_back(2 * uu + n - u);
g[2 * vv + n - v].push_back(u);
gt[u].push_back(2 * vv + n - v);
}
for (int i = 1; i <= 2 * n; ++i) {
if (!vis[i]) {
dfs1(i);
}
}
reverse(all(order));
fill(vis + 1, vis + 2 * n + 1, 0);
for (auto& i : order) {
if (!vis[i]) {
scc[i] = ++k;
dfs2(i);
}
}
bool possible = true;
for (int i = 1; i <= n; ++i) {
possible &= scc[i] != scc[i + n];
}
if (!possible) {
fout << -1;
return 0;
}
for (int i = 1; i <= n; ++i) {
fout << (scc[i] > scc[i + n]) << sp;
}
}