Cod sursa(job #2368976)

Utilizator dacianouaPapadia Mortala dacianoua Data 5 martie 2019 20:18:00
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>
#include <bitset>
#define nmax 100000
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int n,m,comp[(nmax<<1)+5],rang;
vector<int> g[(nmax<<1)+5],gt[(nmax<<1)+5];
vector<int> sol;
bitset< (nmax<<1)+5 > viz;
inline int change(int x) {return(x<0)?(abs(x)+n):x; }
inline int changesecond(int x) {return(x<0)?abs(x):x+n;}
void dfs(int nod)
{
    viz[nod]=1;
    for(int fiu: g[nod])
        if(!viz[fiu])
        dfs(fiu);
    sol.push_back(nod);
}
void dfst(int nod)
{
    comp[nod]=rang;
    viz[nod]=0;
    for(int fiu: gt[nod])
        if(viz[fiu])
        dfst(fiu);
}
int main()
{
    fin>>n>>m;
    int x,y;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        g[changesecond(x)].push_back(change(y));
        g[changesecond(y)].push_back(change(x));
        g[change(x)].push_back(changesecond(y));
        g[change(y)].push_back(changesecond(x));
    }
    for(int i=1;i<=n<<1;i++)
        if(!viz[i])
        dfs(i);
    while(sol.size())
    {
        if(viz[sol.back()])
            ++rang,dfst(sol.back());
        sol.pop_back();
    }
    viz.reset();
    for(int i=1;i<=n;i++)
        if(comp[i]>comp[n+i])
        viz[i]=1;
        else if(comp[i]==comp[n+i])
        {
            fout<<-1;
            return 0;
        }
    for(int i=1;i<=n;i++)
        fout<<viz[i]<<" ";
    return 0;
}