Cod sursa(job #2418984)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 7 mai 2019 11:27:24
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream>
#include<vector>
#include<set>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int m,x,inv[200011],sol[200011],ok,low[200011],niv[200011],d[200011],n,i,j,lvl,a,b,nr,k;
vector<int> s,v[200011];
set<int> S;

void dfs(int nod)
{
    low[nod]=++lvl;niv[nod]=lvl;
    d[nod]=1;
    s.push_back(nod);
    for(auto vecin:v[nod])
    {
        if(niv[vecin]&&d[vecin])
                low[nod]=min(low[nod],niv[vecin]);
        if(niv[vecin]==0)
        {
            dfs(vecin);
            low[nod]=min(low[nod],low[vecin]);
        }
    }
    if(niv[nod]==low[nod])
    {
        S.clear();
        do
        {
            x=s.back();s.pop_back();d[x]=0;
            if(S.find(inv[x])!=S.end()) ok=-1;
            S.insert(x);
            if(sol[x]==0) sol[x]=1,sol[inv[x]]=-1;

        }while(x!=nod);
    }
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>a>>b;
        v[-a+n].push_back(b+n);
        v[-b+n].push_back(a+n);
    }
    for(i=0;i<n;i++) inv[i]=2*n-i,inv[2*n-i]=i;
    for(i=0;i<=n*2;i++)
        if(niv[i]==0&&i!=n)
            dfs(i);
    if(ok==-1) fout<<"-1";
    else for(i=n+1;i<=2*n;i++) if(sol[i]==-1) fout<<"0 "; else fout<<"1 ";
    return 0;
}