Cod sursa(job #1589317)

Utilizator touristGennady Korotkevich tourist Data 3 februarie 2016 21:51:25
Problema 2SAT Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
#define Nmax 200005
#define pb push_back

using namespace std;

vector <int> L[Nmax],T[Nmax];
bool viz[Nmax],Bad;
int SortTopo[Nmax],p,ans[Nmax],n;

inline int 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]) continue;
        Dfs(it);
    }
    SortTopo[++p]=nod;
}

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

int main()
{
    int m,x,y,i;
    ifstream cin("2sat.in");
    ofstream cout("2sat.out");
    cin>>n>>m;
    while(m--)
    {
        cin>>x>>y;
        if(x<0) x=n-x;
        if(y<0) y=n-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);
        ans[i]=-1;
    }
    for(i=2*n;i;--i)
    {
        if(ans[SortTopo[i]]==-1) Solve(SortTopo[i]);
        if(Bad)
        {
            cout<<"-1\n"; return 0;
        }
    }
    for(i=1;i<=n;++i) cout<<ans[i]<<" ";
    cout<<"\n";
    return 0;
}