Cod sursa(job #2232668)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 20 august 2018 14:39:36
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <vector>
#define nmax 200005
using namespace std;
fstream f1("2sat.in", ios::in);
fstream f2("2sat.out", ios::out);
vector<int> v[nmax], nr[nmax], vr[nmax];
int n, m, viz[nmax],l[nmax], nrl, ctc[nmax], nrctc, sol[nmax];
int id(int nod)
{
    if(nod>0) return nod;
    else return n-nod;
}
int negat(int nod)
{
    if(nod>n) return nod-n;
    else return nod+n;
}
void citire()
{
    int x, y;
    f1>>n>>m;
    while(m--)
    {
        f1>>x>>y;
        v[id(-x)].push_back(id(y));
        v[id(-y)].push_back(id(x));

        vr[id(y)].push_back(id(-x));
        vr[id(x)].push_back(id(-y));
    }

}
void dfs(int nod)
{
    viz[nod]=1;
    for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
        if(!viz[*it])
           dfs(*it);
    nrl++; l[nrl]=nod;
}
void DFS(int nod)
{
    viz[nod]=1;
    ctc[nod]=nrctc;
    nr[nrctc].push_back(nod);
    for(auto it=vr[nod].begin(); it!=vr[nod].end(); ++it)
        if(!viz[*it])
           DFS(*it);
}
void kosaraju()
{
    int i;
    for(i=1; i<=2*n; i++)
        if(!viz[i])
           dfs(i);
    for(i=1; i<=2*n; i++) viz[i]=0;
    for(i=nrl; i>=1; i--)
       if(!viz[l[i]])
       {
          nrctc++;
          DFS(l[i]);
       }
}
void solutie()
{
    int i;
    for(i=1; i<=n; i++)
        if(ctc[i]==ctc[i+n])
        {
           f2<<-1; return;
        }
    for(i=1; i<=2*n; i++)
        sol[i]=-1;
    for(i=1; i<=nrctc; i++)
        if(sol[nr[i][0]]==-1)
    {
        for(auto it=nr[i].begin(); it!=nr[i].end(); ++it)
            {
                sol[*it]=0;
                sol[negat(*it)]=1;
            }
    }
    for(i=1; i<=n; i++)
        f2<<sol[i]<<' ';
}
int main()
{
    citire();
    kosaraju();
    solutie();
    return 0;
}