Pagini recente » Cod sursa (job #3272655) | Cod sursa (job #1347342) | Cod sursa (job #3293395) | Cod sursa (job #2758782) | Cod sursa (job #1989937)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
using namespace std;
#define fi first
#define se second
typedef long long LL;
typedef long double LD;
const int MAXN=100010;
int N,M,st[2*MAXN+10],K;
vector<int> g[2*MAXN+10],gc[2*MAXN+10];
int comp[2*MAXN+10],nrC;
int id(int x){
if (x>0) return 2*x-1;
return 2*(-x);
}
void dfs1(int nod){
comp[nod]=1;
for (int nxt : g[nod])
if (!comp[nxt]) dfs1(nxt);
st[++K]=nod;
}
void dfs2(int nod){
comp[nod]=nrC;
for (int nxt : gc[nod])
if (!comp[nxt]) dfs2(nxt);
}
int main(){
ifstream fin("2sat.in");
ofstream fout("2sat.out");
fin >> N >> M;
int i,x,y;
for (i=1; i<=M; i++){
fin >> x >> y;
g[id(-x)].push_back(id(y));
g[id(-y)].push_back(id(x));
gc[id(y)].push_back(id(-x));
gc[id(x)].push_back(id(-y));
}
for (i=1; i<=2*N; i++)
if (!comp[i]) dfs1(i);
memset(comp,0,sizeof(comp));
for (i=2*N; i>0; i--)
if (!comp[st[i]]) nrC++,dfs2(st[i]);
for (i=1; i<=N; i++)
if (comp[id(i)]==comp[id(-i)]){
fout << -1 << "\n";
return 0;
}
for (i=1; i<=N; i++)
fout << (comp[id(i)]>comp[id(-i)]) << " ";
fout << "\n";
return 0;
}