Cod sursa(job #2738663)

Utilizator betybety bety bety Data 6 aprilie 2021 10:51:12
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.41 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int lim=2e5+4;
vector<int> dir[lim];
vector<int> rev[lim];
int n,m,x,y;
int val(int x)
{
    if(x>0) return x;
    return n-x;
}
bool ok[lim];
stack<int> st;
void df(int nod)
{
    ok[nod]=true;
    for(int x:dir[nod])
    if(!ok[x]) df(x);
    st.push(nod);
}
vector<int> elem[lim];
int grupa[lim],cnt;
void df2(int nod)
{
    ok[nod]=true;
    grupa[nod]=cnt;
    elem[cnt].push_back(nod);
    for(int x:rev[nod])
    if(!ok[x]) df2(x);
}
vector<int> vec[lim];
int fin[lim];
void df3(int nod)
{
    ok[nod]=true;
    for(int x:vec[nod])
    if(!ok[x]) df3(x);
    st.push(nod);
}
bool restrict[lim];
int valr(int a)
{
    if(a<=n) return a;
    return a-n;
}
int sgn(int a,int v)
{
    if(a>n) return 1-v;
    return v;
}
int inv(int a)
{
    if(a<=n)
        a+=n;
    else a-=n;
    return a;
}
int main()
{
    in>>n>>m;
    for(int i=1;i<=m;++i)
    {
        in>>x>>y;
        dir[val(-x)].push_back(val(y));
        dir[val(-y)].push_back(val(x));
        rev[val(y)].push_back(val(-x));
        rev[val(x)].push_back(val(-y));
    }
    for(int i=1;i<=2*n;++i)
        fin[i]=-1;
    for(int i=1;i<=2*n;++i)
    if(!ok[i]) df(i);
    memset(ok,0,sizeof(ok));
    while(!st.empty())
    {
        int x=st.top();
        st.pop();
        if(ok[x]) continue;
        ++cnt;
        df2(x);
    }
    for(int i=1;i<=n;++i)
    if(grupa[i]==grupa[i+n])
    {
        out<<-1<<'\n';
        return 0;
    }
    for(int i=1;i<=2*n;++i)
    for(int x:dir[i])
    if(grupa[x]!=grupa[i])
        vec[grupa[i]].push_back(grupa[x]);
    memset(ok,0,sizeof(ok));
    for(int i=1;i<=cnt;++i)
    if(!ok[i]) df3(i);
    while(!st.empty())
    {
        int x=st.top();
        st.pop();
        if(fin[valr(elem[x].back())]!=-1)
            continue;
        if(restrict[x])
        {
            for(int a:vec[x])
                restrict[a]=true;
            for(int a:elem[x])
                fin[valr(a)]=sgn(a,1);
        }
        else
        {
            for(int a:elem[x])
                fin[valr(a)]=sgn(a,0);
            int y=grupa[inv(elem[x].back())];
            restrict[y]=true;
            for(int a:vec[y])
                restrict[a]=true;
        }
    }
    for(int i=1;i<=n;++i)
        out<<fin[i]<<' ';
    return 0;
}