Cod sursa(job #1968425)

Utilizator Radu_GeorgeRadu George Radu_George Data 17 aprilie 2017 18:04:12
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>
#define Nmax 200005

using namespace std;

vector <int> L[Nmax],T[Nmax];
bool seen[Nmax],viz[Nmax],Bad;
int ans[Nmax],order[Nmax],l;

inline void non(int x)
{
    if(x<=n) return x+n;
    return x-n;
}

inline void dfs(int nod)
{
    viz[nod]=1;
    for(auto it : L[nod])
        if(!viz[it]) dfs(it);
    order[++l]=nod;
}

inline void dfs1(int nod)
{
    if(Bad) return;
    seen[nod]=1;
    if(ans[nod]==1)
    {
        Bad=1; return;
    }
    ans[nod]=0; ans[non(nod)]=1;
    for(auto it : T[nod])
        if(!seen[it]) dfs1(it);
}

int main()
{
    int x,y;
    ifstream cin("2sat.in");
    ofstream cout("2sat.out");
    cin>>n>>m;
    while(m--)
    {
        cin>>x>>y;

        if(x<0) x=non(x);
        if(y<0) y=non(y);

        L[non(x)].pb(y);
        L[non(y)].pb(x);
        T[y].pb(non(x));
        T[x].pb(non(y));
    }

    for(i=1;i<=2*n;++i)
        if(!viz[i]) dfs(i);

    for(i=1;i<=n;++i) ans[i]=-1;
    for(i=l;i && !Bad;--i)
        if(!seen[order[i]]) dfs1(order[i]);

    if(Bad) cout<<"-1\n";
    else
    {
        for(i=1;i<=n;++i) cout<<ans[i]<<" ";
        cout<<"\n";
    }
    return 0;
}