Pagini recente » Cod sursa (job #58711) | Cod sursa (job #1524887) | Cod sursa (job #1080710) | Cod sursa (job #2801613) | Cod sursa (job #2666390)
//#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("2sat.in");
ofstream cout("2sat.out");
vector <int> v[200005],vi[200005];
vector <int> comp[200005];
int cont,cnt,viz[200005],order[200005];
int componenta[200005],val[200005];
int n,m;
pair<int,int> st[200005];
int ct=0,cur=0;
int per(int a){
if(a<=n)
return a+n;
return a-n;
}
int inv(int a){
if(a<0)
return (a*-1);
return a+n;
}
int leg(int a){
if(a>0)
return a;
return a*-1+n;
}
void add(int a,int b){
v[a].push_back(b);
vi[b].push_back(a);
}
void dfs1(int w){
viz[w]=1;
for(auto u:v[w]){
if(viz[u]==0){
dfs1(u);
}
}
order[++cont]=w;
}
void dfs2(int w){
viz[w]=1;
comp[cnt].push_back(w);
for(auto u:vi[w]){
if(viz[u]==0){
dfs2(u);
}
}
}
int main()
{
int a,b;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b;
add(leg(a),inv(b));
add(leg(b),inv(a));
}
for(int i=1;i<=2*n;i++){
if(viz[i]==0)
dfs1(i);
}
for(int i=1;i<=2*n;i++)
viz[i]=0;
for(int i=2*n;i>=1;i--){
if(viz[order[i]]==0){
cnt++;
dfs2(order[i]);
}
}
//cout<<cnt<<"\n";
for(int i=1;i<=cnt;i++){
for(auto u:comp[i]){
componenta[u]=i;
}
// cout<<"\n";
}
for(int i=1;i<=n;i++){
if(componenta[i]==componenta[i+n]){
cout<<-1;
return 0;
}
}
for(int i=1;i<=n;i++){
val[i]=(componenta[i]>componenta[i+n]);
cout<<val[i]<<" ";
}
return 0;
}