Pagini recente » Cod sursa (job #42578) | Cod sursa (job #1597523) | Cod sursa (job #1104160) | Cod sursa (job #2430471) | Cod sursa (job #2986160)
#include <bits/stdc++.h>
const int NMAX = 4e5 + 5, SHIFT = 2e5 + 5;
int n, m, k, f[NMAX], col[NMAX], sol[NMAX];
std :: vector < int > G[NMAX], A[NMAX], P[NMAX];
std :: stack < int > st;
#define G (G + SHIFT)
#define A (A + SHIFT)
#define f (f + SHIFT)
#define sol (sol + SHIFT)
#define col (col + SHIFT)
void DFS(int node) {
f[node] = true;
for (int i = 0; i < G[node].size(); ++ i) {
int u = G[node][i];
if (f[u] == false)
DFS(u);
}
st.push(node);
return;
}
void DFSUtil(int node) {
col[node] = k;
f[node] = true;
for (int i = 0; i < A[node].size(); ++ i) {
int u = A[node][i];
if (f[u] == false)
DFSUtil(u);
}
return;
}
void solve(int node, int c) {
f[node] = true;
for (int i = 0; i < P[node].size(); ++ i) {
int u = P[node][i];
sol[u] = c;
}
for (int i = 0; i < P[node].size(); ++ i) {
int u = P[node][i];
if (f[col[-u]] == false)
solve(col[-u], !c);
}
return;
}
std :: ifstream fin("2sat.in");
std :: ofstream fout("2sat.out");
int main() {
fin >> n >> m;
for (int i = 1, u, v; i <= m; ++ i) {
fin >> u >> v;
G[u].push_back(-v);
G[v].push_back(-u);
A[-v].push_back(u);
A[-u].push_back(v);
}
for (int i = -n; i <= n; ++ i)
if (f[i] == false)
DFS(i);
for (int i = -n; i <= n; ++ i)
f[i] = false;
while (!st.empty()) {
int u = st.top();
if (col[u] == 0) {
++ k;
DFSUtil(u);
}
st.pop();
}
for (int i = 1; i <= n; ++ i)
if (col[i] == col[-i]) {
fout << "-1\n";
return 0;
}
for (int i = -n; i <= n; ++ i)
P[col[i]].push_back(i);
for (int i = 1; i <= k; ++ i)
f[i] = false;
for (int i = 1; i <= k; ++ i)
if (f[i] == false)
solve(i, +1);
for (int i = 1; i <= n; ++ i)
fout << sol[i] << " ";
return 0;
}