Cod sursa(job #2369005)

Utilizator dacianouaPapadia Mortala dacianoua Data 5 martie 2019 20:34:30
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 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 ind(int x) {

	if(x > 0) return x;

	return n - x;

}
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)
{
    viz[nod]=0;
    for(int fiu: gt[nod])
        if(viz[fiu])
        dfst(fiu);
    comp[nod]=rang;
}
int main()
{
    fin>>n>>m;
    int x,y;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        g[ind(-x)].emplace_back(ind(y));
        gt[ind(y)].emplace_back(ind(-x));
        g[ind(-y)].emplace_back(ind(x));
        gt[ind(x)].emplace_back(ind(-y));
    }
    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;
}