Cod sursa(job #2325904)

Utilizator crion1999Anitei cristi crion1999 Data 23 ianuarie 2019 10:18:40
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include <bits/stdc++.h>
#define NMAX 200010
using namespace std;
ifstream fi("2sat.in");
ofstream fo("2sat.out");
int N, M;
int components[NMAX];
int visited[NMAX];
vector<int> adjacentMatrix[NMAX];
vector<int> transposedAdjacentMatrix[NMAX];
stack<int> stacc;
stack<int> stacc2;

void satisfyDepth(int node)
{
    if(visited[node] != -1 || visited[node^1] != -1)
        return;
    visited[node] = 0;
    for(auto y:transposedAdjacentMatrix[node])
    {
        satisfyDepth(y);

    }
}

void depthSearch(int node)
{
    if(components[node])
        return;

    components[node] = 1;
    for(auto y:adjacentMatrix[node])
        depthSearch(y);
    stacc.push(node);
}

void transposedDepthFirst(int node, int paint)
{
    if(components[node])
        return;
    components[node] = paint;
    for(auto y:transposedAdjacentMatrix[node])
        transposedDepthFirst(y, paint);
}
int main()
{
    fi>>N>>M;
    for(int i = 1; i <= M; ++i)
    {
        int a,b;
        fi>>a>>b;

        if(a > 0) a = a*2;
        else a = -a*2 + 1;

        if(b > 0) b = b*2;
        else b = -b*2 + 1;

        adjacentMatrix[a^1].push_back(b);
        adjacentMatrix[b^1].push_back(a);
        transposedAdjacentMatrix[a].push_back(b^1);
        transposedAdjacentMatrix[b].push_back(a^1);
    }
    for(int i = 2; i <= 2*N+1; ++i)
        depthSearch(i);

    for(int i = 2; i <= 2*N+1; ++i)
    {
        components[i] = 0;
        visited[i] = -1;
    }
    stacc2 = stacc;
    int componentNumber = 0;
    while(!stacc.empty())
    {
        if(components[stacc.top()] == 0)
        {
            componentNumber++;
            transposedDepthFirst(stacc.top(),componentNumber);
        }
        stacc.pop();
    }
    for(int i = 2; i <= 2*N+1; ++i)
    {
        cout<<i<<": ";
        for(auto y:adjacentMatrix[i])
            cout<<y<<" ";
        cout<<"\n";
    }
    for(int i = 2; i <= 2*N; i += 2)
    {

        if(components[i^1] == components[i])
        {
            fo<<-1;
            return 0;
        }
    }

    while(!stacc2.empty())
    {
        int node = stacc2.top();
        satisfyDepth(node);
        stacc2.pop();
    }
    for(int i = 2; i <= 2*N; i += 2)
    {
        if(visited[i] != -1)
            fo<<visited[i]<<" ";
        else
            fo<<1-visited[i^1]<<" ";
    }

}