Cod sursa(job #2624462)

Utilizator loraclorac lorac lorac Data 4 iunie 2020 21:03:38
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream cin("2sat.in");
ofstream cout("2sat.out");
const int lim=2e5+5;
vector<int> vec[lim];
vector<int> rev[lim];
vector<int> ies[lim];
stack<int> st;
bool ok[lim];
void df(int nod)
{
    ok[nod]=true;
    for(auto x:vec[nod])
    if(!ok[x]) df(x);
    st.push(nod);
}
int tip[lim],nrg;
int per[lim];
void grf(int nod)
{
    ok[nod]=true;
    tip[nod]=nrg;
    for(auto x:rev[nod])
    if(!ok[x]) grf(x);
}
void cp(int nod)
{
    ok[nod]=true;
    for(auto x:ies[nod])
    if(!ok[x]) cp(x);
    st.push(nod);
}
bool val[lim];
int main()
{
    int n,m,a,b;
    cin>>n>>m;
    for(int i=1;i<=m;++i)
    {
        cin>>a>>b;
        vec[n-a].push_back(n+b);
        rev[n+b].push_back(n-a);
        vec[n-b].push_back(n+a);
        rev[n+a].push_back(n-b);
    }
    for(int i=0;i<=2*n;++i)
    if(!ok[i] and i!=n) df(i);
    for(int i=0;i<=2*n;++i)
        ok[i]=false;
    while(!st.empty())
    {
        int x=st.top();
        st.pop();
        if(!ok[x])
            ++nrg,grf(x);
    }
    ok[0]=false;
    for(int i=1;i<=n;++i)
    {
        if(tip[n+i]==tip[n-i])
        {
            cout<<-1<<'\n';
            return 0;
        }
        else per[tip[n+i]]=tip[n-i],
            per[tip[n-i]]=tip[n+i];
        ok[i]=ok[n+i]=false;
    }
    for(int i=0;i<=2*n;++i)
    if(i!=n) for(auto y:vec[i])
        ies[tip[i]].push_back(tip[y]);
    for(int i=1;i<=nrg;++i)
    if(!ok[i]) cp(i);
    for(int i=1;i<=nrg;++i)
        ok[i]=false;
    while(!st.empty())
    {
        int x=st.top();
        st.pop();
        if(!ok[x])
        {
            val[x]=false;
            val[per[x]]=true;
            ok[x]=ok[per[x]]=true;
        }
    }
    for(int i=n+1;i<=2*n;++i)
        cout<<val[tip[i]]<<' ';
    return 0;
}