Cod sursa(job #2510291)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 16 decembrie 2019 11:02:30
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.19 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#define MAX 100000
#define INF 2e9

using namespace std;

vector<int> graf[2 * MAX];
vector<int> stiva;
vector<vector<int>> listComp;
bool onStack[MAX], SAT2[MAX];
int up[MAX], viz[MAX], whatComp[MAX], vizCount, compCount;

void clearStack(int nod)
{
    vector<int> comp;

    compCount++;
    while(stiva.back() != nod)
    {
        comp.push_back(stiva.back());
        whatComp[stiva.back()] = compCount;

        onStack[stiva.back()] = 0;
        stiva.pop_back();
    }


    comp.push_back(stiva.back());
    whatComp[stiva.back()] = compCount;

    onStack[stiva.back()] = 0;
    stiva.pop_back();

    listComp.push_back(comp);

    //cout << "something!";
}

void DFS(int nod)
{
    vizCount++;
    viz[nod] = vizCount;
    up[nod] = vizCount;

    stiva.push_back(nod);
    onStack[nod] = 1;

    for(auto i : graf[nod])
    {
        if(!viz[i])
        {
            DFS(i);

            up[nod] = min(up[nod], up[i]);
        }
        else if(onStack[i])
            up[nod] = min(up[nod], viz[i]);
    }

    if(up[nod] == viz[nod])
        clearStack(nod);
}

int getIndex(int x)
{
    if(x < 0)return -x + MAX;

    return x;
}

int getReversedIndex(int x)
{
    if(x < 0)return -x;

    return x + MAX;
}

int main()
{
    int n, m, a, b;

    ifstream fin("2sat.in");
    ofstream fout("2sat.out");

    fin >> n >> m;

    for(int i = 0; i < m; i++)
    {
        fin >> a >> b;

        graf[getReversedIndex(a)].push_back(getIndex(b));
        graf[getReversedIndex(b)].push_back(getIndex(a));
    }

    for(int i = 1; i <= n; i ++)
        if(!viz[i])
        {
            DFS(i);

            for(auto i = listComp.begin(); i != listComp.end(); i++)
            {
                for(auto j = i->begin(); j != i->end(); j++)
                {                    if(*j > MAX)SAT2[*j - MAX] = 1;
                    else SAT2[*j] = 0;
                }

                listComp.pop_back();
            }
        }

    for(int i = 1; i <= n; i++)fout << SAT2[i] << " ";

    fin.close();
    fout.close();

    return 0;
}