Cod sursa(job #3294293)

Utilizator Sorin_GabrielGabara Sorin Gabriel Sorin_Gabriel Data 21 aprilie 2025 00:18:53
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.42 kb
//https://www.infoarena.ro/job_detail/3201005?action=view-source
#include <bits/stdc++.h>
#define VMAX 100005
#define INF 2000000000
using namespace std;
ifstream fin ("2sat.in");
ofstream fout ("2sat.out");


vector<int> graf[2*VMAX]; // 1-n muchii cu -, n+1-2*n - muchii normale
vector<int> graf_inv[2*VMAX];
vector<int> graf_nou[2*VMAX];
vector<int> componente[2*VMAX];
int scc[2*VMAX];
int nr_componente;
vector<int> coada;
bool vizitat[2*VMAX];
int n;

int not_a(int x)
{
    if(x<=n)
        return x+n;
    else
        return x-n;
}

void dfs(int nod)
{
    vizitat[nod]=1;
    for(auto i:graf[nod])
    {
        if(vizitat[i]==0)
            dfs(i);
    }
    coada.push_back(nod);
}

void dfs_inv(int nod)
{
    componente[nr_componente].push_back(nod);
    scc[nod]=nr_componente;
    vizitat[nod]=1;
    for(auto i:graf_inv[nod])
    {
        if(vizitat[i]==0)
            dfs_inv(i);
    }
}


int main()
{
    int m,i,j,k,t,q,nr,minim,maxim,suma;
    fin>>n>>m;
    for(i=0;i<m;i++)
    {
        fin>>j>>k;
        if(j<=0)
            j=abs(j);
        else
            j+=n;
        if(k<=0)
            k=abs(k);
        else
            k+=n;

        j=not_a(j);
        graf[j].push_back(k);
        graf_inv[k].push_back(j);
        j=not_a(j);
        k=not_a(k);

        graf[k].push_back(j);
        graf_inv[j].push_back(k);
    }
    for(i=1;i<=2*n;i++)
        if(vizitat[i]==0)
            dfs(i);

    for(i=1;i<=2*n;i++)
        vizitat[i]=0;
    while(coada.size())
    {
        i=coada.back();
        coada.pop_back();
        if(vizitat[i]==0)
        {
            dfs_inv(i);
            nr_componente++;
        }
    }

    for(i=1;i<=n;i++)
        if(scc[i]==scc[i+n])
            break;

    if(i<=n)
    {
        fout<<"-1\n";
        return 0;
    }
    else
    {
        for(i=1;i<=n;i++)
        {
            fout<<(scc[i]<scc[not_a(i)])<<' ';
        }
    }

    for(i=0;i<nr_componente;i++)
    {
        for(j=1;j<componente[i].size();j++)
        {
            for(k=0;k<graf_inv[componente[i][j]].size();k++)
            {
                graf[graf_inv[componente[i][j]][k]].push_back(componente[i][0]);
            }

            for(k=0;k<graf[componente[i][j]].size();k++)
                graf[componente[i][0]].push_back(graf[componente[i][j]][k]);
        }
    }


    return 0;
}