Cod sursa(job #3239571)

Utilizator matei8787Matei Dobrea matei8787 Data 6 august 2024 15:57:02
Problema 2SAT Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.56 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");

const int N = 100005;
vector<int> g[N*2], gt[2*N];
int n, m;
int bareaza(int x)
{
    if ( x > 0 )
        return x + n;
    return -x;
}
int trnod(int x)
{
    if ( x > 0 )
        return x;
    return (-x) + n;
}
void citire()
{
    in>>n>>m;
    for ( int i = 1 ; i <= m ; i++ )
    {
        int x, y;
        in>>x>>y;
        g[bareaza(x)].push_back(trnod(y));
        g[bareaza(y)].push_back(trnod(x));
    }
}
void make_gt()
{
    for ( int i = 1 ; i <= n * 2 ; i++ )
    {
        for ( int x : g[i] )
        {
            gt[x].push_back(i);
        }
    }
}
vector<int> st_ctc;
bool viz[N*2];
void dfsimplu(int nod)
{
    viz[nod] = true;
    for ( int vec : g[nod] )
    {
        if ( viz[vec] )
            continue;
        dfsimplu(vec);
    }
    st_ctc.push_back(nod);
}
int ctc[2*N], nrctc;
void df_tr(int nod)
{
    ctc[nod] = nrctc;
    for ( int vec : gt[nod] )
    {
        if ( !ctc[vec] )
            df_tr(vec);    
    }
}
void make_ctc()
{
    
    for ( int i = 1 ; i <= n * 2 ; i++ )
    {
        if ( !viz[i] )
            dfsimplu(i);
    }
    reverse(st_ctc.begin(), st_ctc.end());
    make_gt();
    for ( int x : st_ctc )
    {
        if ( !ctc[x] )
        {
            nrctc++;
            df_tr(x);
        }
    }
}
void afis_graf()
{
    for ( int i = 1 ; i <= n * 2 ; i++ )
    {
        cout<<i<<": ";
        for ( int x : g[i] )
        {
            cout<<x<<" ";
        }
        cout<<'\n';
    }
}
void afis_cc()
{
    for ( int i = 1 ; i <= 2 * n ; i++ )
    {
        cout<<ctc[i]<<" ";
    }
}
vector<int> gctc[N*2];
void rmdup(vector<int>& v)
{
    if ( v.size() == 0 )
        return;
    vector<int> ans;
    ans.push_back(v[0]);
    for ( int i = 1 ; i < v.size() ; i++ )
    {
        if ( v[i] != ans[ans.size()-1] )
        {
            ans.push_back(v[i]);
        }
    }
    while ( v.size() > 0 )
        v.pop_back();
    for ( int i : ans )
    {
        v.push_back(i);
    }
}
void make_graf_ctc()
{
    for ( int i = 1 ; i <= 2 * n ; i++ )
    {
        for ( int x : g[i] )
        {
            if ( ctc[i] != ctc[x] )
                gctc[ctc[i]].push_back(ctc[x]);
        }
    }
    for ( int i = 1 ; i <= nrctc ; i++ )
    {
        sort(gctc[i].begin(), gctc[i].end());
        rmdup(gctc[i]);
    }
}
void afis_graf_ctc()
{
    for ( int i = 1 ; i <= nrctc ; i++ )
    {
        cout<<i<<": ";
        for ( int x : gctc[i] )
        {
            cout<<x<<" ";
        }
        cout<<'\n';
    }
}
vector<int> stop;
int vizi[2*N];
void dfs_sorttop(int nod)
{

    for ( int vec : gctc[nod] )
    {
        if ( !vizi[vec] )
            dfs_sorttop(vec);
    }
    stop.push_back(nod);
    vizi[nod] = 1;
}
void make_sort_top()
{
    vector<int> grad_in(2*N, 0);
    for ( int i = 1 ; i <= nrctc ; i++ )
    {
        for ( int x : gctc[i] )
        {
            grad_in[x]++;
        }
    }
    for ( int i = 1 ; i <= nrctc ; i++ )
    {
        if ( grad_in[i] == 0 )
            dfs_sorttop(i);
    }
    reverse(stop.begin(), stop.end());
}
void rez()
{
    make_ctc();
    make_graf_ctc();
    make_sort_top();
    vector<int> ans(2*n+1, -1);
    int st = 0;
    int dr = stop.size() - 1;
    while ( st < dr )
    {
        for ( int i = 1 ; i <= 2 * n ; i++ )
        {
            if ( ctc[i] == stop[st] )
                ans[i] = 0;
            if ( ctc[i] == stop[dr] )
                ans[i] = 1;
        }
        st++;
        dr--;
    }
    for ( int i = 1 ; i <= n ; i++ )
        out<<ans[i]<<" ";
}

int main()
{
    citire();
    rez();
}