Pagini recente » Cod sursa (job #2453329) | Cod sursa (job #2938174) | Cod sursa (job #806329) | Cod sursa (job #507654) | Cod sursa (job #2899876)
/// always:
#include <cstdio>
#include <string>
/// optional:
#include <cassert>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
bool home = 1;
using namespace std;
const string TASKNAME="2sat";
const int N=200000+7;
int n;
int m;
bool vis[N];
vector<int> g[N];
vector<int> ig[N];
vector<int> ord;
void dfs(int a) {
if (vis[a]) return;
vis[a]=1;
for (auto &b:g[a]) {
dfs(b);
}
ord.push_back(a);
}
int comp[N],cur;
void invdfs(int a) {
if(vis[a]) return;
comp[a]=cur;
vis[a]=1;
for (auto &b:ig[a]) {
invdfs(b);
}
}
void addEdge(int a, int b) {
g[a].push_back(b);
ig[b].push_back(a);
}
int inv(int x) {
if (x<=n) return x+n;
return x-n;
}
signed main() {
#ifdef INFOARENA
home = 0;
#endif
if(!home) {
freopen((TASKNAME + ".in").c_str(), "r", stdin);
freopen((TASKNAME + ".out").c_str(), "w", stdout);
}else{
freopen ("I_am_iron_man", "r", stdin);
}
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++) {
int a,b;
scanf("%d%d",&a,&b);
if (a<0) a=n-a;
if (b<0) b=n-b;
assert(1<=a&&a<=2*n);
assert(1<=b&&b<=2*n);
addEdge(a,inv(b));
addEdge(inv(a),b);
}
for (int i=1;i<=2*n;i++) {
dfs(i);
}
reverse(ord.begin(),ord.end());
for (int i=1;i<=2*n;i++) {
vis[i]=0;
}
for (auto &i:ord) {
if(vis[i]) continue;
cur++;
invdfs(i);
}
for (int i=1;i<=n;i++) {
if(comp[i]==comp[i+n]){
printf("-1\n");
exit(0);
}
}
for (int i=1;i<=n;i++) {
printf("%d ", (comp[i]<comp[i+n]));
}
}