Cod sursa(job #2286164)

Utilizator zhm248Mustatea Radu zhm248 Data 19 noiembrie 2018 21:19:04
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.2 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#include<stack>
using namespace std;
vector<int>g[200001],c[200001],v;
stack<int>st;
int disc[200001],low[200001],n,val,nrc,cc[200001],sol[100001],found[200001];
bool ins[200001];
int negare(int x,int n)
{
    if(x>n)
    return x-n;
    return x+n;
}

void scc(int x)
{
    val++;
    disc[x]=val;
    low[x]=val;
    st.push(x);
    ins[x]=1;
    int i,u;
    for(i=0;i<(int)g[x].size();++i)
    {
        if(!disc[g[x][i]])
        {
            scc(g[x][i]);
            low[x]=min(low[x],low[g[x][i]]);
        }
        else
        {
            if(ins[g[x][i]])
                low[x]=min(low[x],low[g[x][i]]);
        }
    }
    if(disc[x]==low[x])
    {
        v.clear();
        do
        {
            u=st.top();
            v.push_back(u);
            ins[u]=0;
            st.pop();
        }while(u!=x);
        nrc++;
        for(i=0;i<(int)v.size();++i)
        {
            c[nrc].push_back(v[i]);
            cc[v[i]]=nrc;
        }
    }
}

int main()
{
    freopen("2sat.in","r",stdin);
    freopen("2sat.out","w",stdout);
    int m,i,j,x,y;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        if(x<0)
            x=n-x;
        if(y<0)
            y=n-y;
        g[negare(x,n)].push_back(y);
        g[negare(y,n)].push_back(x);
    }
    for(i=1;i<=2*n;++i)
    {
        if(!disc[i])
            scc(i);
    }
    bool ok=1;
    for(i=1;i<=n;++i)
    {
        if(cc[i]==cc[i+n])
        {
            printf("-1\n");
            ok=0;
            break;
        }
    }
    if(ok)
    {
        for(i=nrc;i;--i)
        {
            for(j=0;j<(int)c[i].size();++j)
            {
                if((c[i][j]<=n&&found[c[i][j]])||(c[i][j]>n&&found[c[i][j]-n]))
                    break;
                if(c[i][j]>n)
                {
                    found[c[i][j]-n]=1;
                    sol[c[i][j]-n]=1;
                }
                else
                    found[c[i][j]]=1;
            }
        }
        for(i=1;i<=n;++i)
        {
            printf("%d ",sol[i]);
        }
    }
    return 0;
}