Cod sursa(job #2666388)

Utilizator NashikAndrei Feodorov Nashik Data 1 noiembrie 2020 17:57:15
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
//#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[i]==0){
            cnt++;
            dfs2(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;
}