Cod sursa(job #2292444)

Utilizator pistvanPeter Istvan pistvan Data 29 noiembrie 2018 16:13:26
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define MAXN 100001
using namespace std;

vector<int> G[2*MAXN+1];
vector<int> GT[2*MAXN+1];
int vis[2*MAXN+1], N, M, comp_i=-1;
vector<int> v_assign;
stack<int> S;

void Read()
{
    ifstream f("2sat.in");
    f>>N>>M;
    for (int i=-N;i<=N;i++)
    {
        if (i==0)
            continue;
        G[N+i].push_back(0);
        GT[N+i].push_back(0);
    }
    int a, b;
    for (int i=0;i<M;i++)
    {
        f>>a>>b;
        G[N-a].push_back(b);
        G[N-a][0]++;
        G[N-b].push_back(a);
        G[N-b][0]++;
        GT[N+a].push_back(-b);
        GT[N+a][0]++;
        GT[N+b].push_back(-a);
        GT[N+b][0]++;
    }
}

void Visit(int a)
{
    vis[N+a]=-1;
    for (int i=1;i<=G[N+a][0];i++)
        if (vis[N+G[N+a][i]]==0)
            Visit(G[N+a][i]);
    S.push(a);
}

void Assign(int a, int root)
{
    vis[N+a]=comp_i;
    for (int i=1;i<=GT[N+a][0];i++)
        if (vis[GT[N+a][i]]==-1)
            Assign(GT[N+a][i], root);
}

void KosarajuSharir()
{
    for (int i=-N;i<=N;i++)
    {
        if (i==0)
            continue;
        if (vis[N+i]==0)
            Visit(i);
    }

    while (!S.empty())
    {
        int a=S.top();
        if (vis[N+a]==-1)
        {
            ++comp_i;
            v_assign.push_back(0);
            Assign(a, a);
        }
        else
            S.pop();
    }

}

void Solve()
{
    int i=0, j=v_assign.size()-1;
    while (i<j)
    {
        v_assign[i]=0;
        v_assign[j]=1;
        i++;
        j--;
    }
    for (int i=-N;i<=N;i++)
    {
        if (i==0)
            continue;
        vis[N+i]=v_assign[vis[N+i]];
    }
}

void Write()
{
    ofstream g("2sat.out");
    for (int i=1;i<=N;i++)
        g<<vis[N+i]<<' ';
}

int main()
{
    Read();
    KosarajuSharir();
    Solve();
    Write();
}