Pagini recente » Cod sursa (job #2791968) | Cod sursa (job #362504) | Cod sursa (job #2647994) | Cod sursa (job #1089560) | Cod sursa (job #2419772)
//ALEX ENACHE
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <cmath>
#include <assert.h>
#include <stack>
#include <bitset>
#include <random>
#include <chrono>
using namespace std;
//#include <iostream>
#include <fstream>
ifstream cin ("2sat.in");ofstream cout ("2sat.out");
int n , m;
int val (int nr){
if (nr < 0){
return n-nr;
}
return nr;
}
int non (int nr){
if (nr <= n){
return nr + n;
}
return nr - n;
}
vector < int > gr[200100];
vector < int > inv[200100];
vector < int > ord;
int used[200100];
void dfs1 (int nod){
used[nod] = 1;
for (auto &x : gr[nod]){
if (!used[x]){
dfs1(x);
}
}
ord.push_back(nod);
}
vector < int > ctc[200100];
int cul[200100];
int cont;
void dfs2 (int nod){
used[nod] = 1;
cul[nod] = cont;
ctc[cont].push_back(nod);
for (auto &x : inv[nod]){
if (!used[x]){
dfs2(x);
}
}
}
int ans[200100];
int main() {
//freopen("input", "r", stdin);freopen("output", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cout << setprecision(10) << fixed;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
srand(time(nullptr));
cin>>n>>m;
for (int i=1; i<=m; i++){
int a , b;
cin>>a>>b;
a = val(a);
b = val(b);
//cout<<a<<" "<<b<<'\n';
gr[non(a)].push_back(b);
gr[non(b)].push_back(a);
inv[a].push_back(non(b));
inv[b].push_back(non(a));
}
for (int i=1; i<=2*n; i++){
if (!used[i]){
dfs1(i);
}
}
reverse (ord.begin() , ord.end());
for (int i=1; i<=2*n; i++){
used[i] = 0;
}
for (auto &x : ord){
if (!used[x]){
cont++;
dfs2(x);
}
}
for (int i=1; i<=n; i++){
if (cul[i] == cul[i+n]){
cout<<-1;
return 0;
}
}
for (int i=1; i<=2*n; i++){
used[i] = 0;
}
//cout<<"cont : "<<cont<<'\n';
for (int i=1; i<=cont; i++){
/*cout<<i<<" : ";
for (auto &x : ctc[i]){
cout<<x-n<<" ";
}
cout<<'\n';*/
if (!used[i]){
used[i] = 1;
for (auto &x : ctc[i]){
ans[x] = 1;
used[cul[non(x)]] = 1;
}
}
}
for (int i=1; i<=n; i++){
cout<<(ans[i]^1)<<" ";
}
return 0;
}