Pagini recente » Cod sursa (job #1003846) | Cod sursa (job #583312) | Cod sursa (job #1446138) | Cod sursa (job #706667) | Cod sursa (job #2127993)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
ifstream f("2sat.in");
ofstream g("2sat.out");
int n, m;
int cnt = 0;
vector< int > gr[MAXN], gri[MAXN], ctc[MAXN], v;
bool viz[MAXN];
int where[MAXN];
int ind(int x){
if(x < 0) return abs(x) + n;
return x;
}
void read(){
f >> n >> m;
for(int i = 0; i < m; ++i){
int x, y;
f >> x >> y;
gr[ind(-x)].push_back(ind(y));
gri[ind(y)].push_back(ind(-x));
gr[ind(-y)].push_back(ind(x));
gri[ind(x)].push_back(ind(-y));
}
}
void dfs1(int node){
viz[node] = true;
for(auto x : gr[node]){
if(viz[x]) continue;
dfs1(x);
}
v.push_back(node);
}
void dfs2(int node, int cnt){
viz[node] = false;
where[node] = cnt;
ctc[cnt].push_back(node);
for(auto x : gr[node]){
if(viz[node]) dfs2(x, cnt);
}
}
void find_ctc(){
for(int i = 1; i <= (n<<1); ++i){
if(!viz[i]) dfs1(i);
}
reverse(v.begin(), v.end());
for(auto x : v){
if(viz[x]){
dfs2(x, ++cnt);
}
}
}
void solve(){
for(int i = 1; i <= n; ++i){
if(where[i] == where[n + i]){
g << -1;
return;
}
}
for(int i = 1; i <= n; ++i){
if(where[i] < where[i + n]) g << 0;
else g << 1;
g << ' ';
}
}
int main(){
read();
find_ctc();
solve();
return 0;
}