Cod sursa(job #2232415)

Utilizator HumikoPostu Alexandru Humiko Data 18 august 2018 23:38:48
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;

bool WROOOOOOONG;

bool f[200005];
bool answer[200005];

stack <int> road;

vector <int> graph[200005];
vector <int> reversed_Graph[200005];
vector <int> strongly_Connected_Components[200005];

int flip (int node)
{
    if ( node > n ) return node-n;
    return node+n;
}

void resetFrequency ()
{
    for ( int i = 0; i <= 2*n+5; ++i )
        f[i] = 0;
}

void dfs (int node)
{
    f[node] = 1;

    for ( auto x:graph[node] )
        if ( f[x] == 0 )
            dfs(x);

    road.push(node);
}

void reverseDfs (int node, int indx)
{
    if ( answer[node] == 1 )
    {
        WROOOOOOONG = 1;
        return;
    }

    f[node] = 1;
    answer[flip(node)] = 1;

    for ( auto x:reversed_Graph[node] )
        if ( f[x] == 0 )
            reverseDfs(x, indx);

    strongly_Connected_Components[indx].push_back(node);
}

int main()
{
    fin>>n>>m;

    for ( int i = 1; i <= m; ++i )
    {
        int first_Node, second_Node;
        fin>>first_Node>>second_Node;

        first_Node += n;
        second_Node += n;

        graph[flip(first_Node)].push_back(second_Node);
        graph[flip(second_Node)].push_back(first_Node);

        reversed_Graph[second_Node].push_back(flip(first_Node));
        reversed_Graph[first_Node].push_back(flip(second_Node));
    }

    for ( int i = 1; i <= 2*n; ++i )
        if ( f[i] == 0 )
            dfs(i);

    resetFrequency();

    int indx = 0;

    while ( road.size() )
    {
        if ( f[road.top()] == 0 && f[flip(road.top())] == 0 )
            reverseDfs(road.top(), ++indx);

        road.pop();
    }

    if ( WROOOOOOONG == true )
        fout<<"-1"<<'\n';
    else
        for ( int i = 0; i < n; ++i )
            fout<<answer[i]<<" ";

}