Pagini recente » Cod sursa (job #2980306) | Cod sursa (job #2495098) | Cod sursa (job #3037807) | Cod sursa (job #822457) | Cod sursa (job #497530)
Cod sursa(job #497530)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int N, M;
vector<vector<int> > G, GT;
vector<int> viz;
vector<int> st;
vector<int> val;
inline int neg(int nod) {
if (nod <= N) return nod + N;
else return nod - N;
}
void dfs(int nod) {
viz[nod] = 1;
for (int i = 0; i < G[nod].size(); ++i) {
int nod2 = G[nod][i];
if (!viz[nod2]) dfs(nod2);
}
st.push_back(nod);
}
int impossible;
void dft(int nod) {
if (val[nod]) impossible = 1;
val[nod] = 0; val[neg(nod)] = 1;
viz[nod] = 1;
for (int i = 0; i < GT[nod].size(); ++i) {
int nod2 = GT[nod][i];
if (!viz[nod2]) dft(nod2);
}
}
int main() {
freopen("2sat.in", "r", stdin);
freopen("2sat.out", "w", stdout);
scanf("%d %d", &N, &M);
G.resize(2*N+1); GT.resize(2*N+1);
viz.resize(2*N + 1);
val.resize(2*N + 1);
while (M--) {
int a, b;
scanf("%d %d", &a, &b);
if (a < 0) a = -a + N;
if (b < 0) b = -b + N;
// a v b, ~a -> b, ~b -> a
G[neg(a)].push_back(b);
G[neg(b)].push_back(a);
// GT
GT[b].push_back(neg(a));
GT[a].push_back(neg(b));
}
for (int i = 1; i <=2*N; ++i) if (!viz[i]) dfs(i);
viz.assign(2*N+1, 0);
for (int i = st.size() - 1; i >= 0; --i) if (!viz[st[i]] &&
!viz[neg(st[i])] ) dft(st[i]);
if (impossible) printf("-1\n");
else {
for (int i = 1; i <= N; ++i) printf("%d ", val[i]);
}
return 0;
}