Cod sursa(job #3272819)

Utilizator Bolfa_DBolfa Diana Bolfa_D Data 30 ianuarie 2025 23:10:50
Problema 2SAT Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.7 kb
#include <bits/stdc++.h>
#define NMAX 200200
#define MOD 20050000
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int disc[NMAX], low[NMAX], c[NMAX], g[NMAX];
bool use[NMAX];
vector<int>v[NMAX], elem[NMAX], cv[NMAX], cap;
deque<int> q;
int cost, ad, a,b,y,x,n,m;
void dfs(int node)
{
    ++cost;
    disc[node]=cost;
    low[node]=cost;
    use[node]=1;
    q.push_back(node);

    for(auto e:v[node])
        if(disc[e]==MOD)
        {
            dfs(e);
            low[node]=min(low[node], low[e]);
        }
        else if(use[e]==1)
            low[node]=min(low[node], low[e]);

    if(disc[node]==low[node])
    {
        cap.push_back(node);// lista componentelor
        while(!q.empty() && q.back()!=node)
        {
            c[q.back()]=node;
            elem[node].push_back(q.back());//componenta new are elementele astea
            use[q.back()]=0;
            q.pop_back();
        }
        c[node]=node;
        elem[node].push_back(node);
        use[node]=0;
        q.pop_back();
    }
}
void topsort()
{
    while(!q.empty())
    {
        x=q.front();
        q.pop_front();
        for(auto i:cv[x])//comvecine pt com x
        {
            --g[i];
            c[i]=max(c[x], c[i]);
            if(g[i]==0)
            {
                for(auto j:elem[i])
                    if(j<=n)
                    {
                        c[j]=c[i];
                        c[j+ad]=-c[i];
                    }
                    else
                    {
                        c[j]=c[i];
                        c[j-ad]=-c[i];
                    }
                q.push_back(i);
            }
        }
    }
}
int main()
{
    fin>>n>>m;
    ad=n+1;
    for(int i=1;i<=m;++i)
    {
        fin>>a>>b;
        if(a<0)
        {
            x=-a;//inv
            a=-a+ad;
        } else x=a+ad;
        if(b<0)
        {
            y=-b;
            b=-b+ad;
        }else y=b+ad;
        v[x].push_back(b);
        v[y].push_back(a);
    }

//    for(int i=1;i<=n+ad;++i)
//    {
//        cout<<i<<"  ";
//        for(auto j:v[i])
//            cout<<j<<" ";
//        cout<<'\n';
//    }cout<<'\n';


    for(int i=1;i<=n+ad;++i)
    {
        low[i]=MOD;
        disc[i]=MOD;
    }

    for(int i=1;i<=n+ad;++i)
        if(disc[i]==MOD)
            dfs(i);

//            cout<<'\n';
//    for(int i=1;i<=n;++i)
//        cout<<disc[i]<<" ";
//    cout<<'\n';
//    for(int i=ad+1;i<=n+ad;++i)
//        cout<<disc[i]<<" ";
//    cout<<'\n' <<'\n';
//
//    for(int i=1;i<=n;++i)
//        cout<<low[i]<<" ";
//    cout<<'\n';
//    for(int i=ad+1;i<=n+ad;++i)
//        cout<<low[i]<<" ";
//    for(int i=1;i<=n+ad;++i)
//        cout<<c[i]<< " ";

    for(int i=1;i<=n;++i)
        if(c[i]==c[i+ad])
        {
            fout<<-1;
            return 0;
        }

    for(auto i:cap)//prin componente
        for(auto j:elem[i])//prin elem componentei
            for(auto k:v[j])//care s vecinii
                if(c[k]!=i)
                    cv[i].push_back(c[k]);//componenta i are vecin componenta

    for(auto i:cap)
        for(auto j:cv[i])//grad int
            g[j]++;

    for(int i=1;i<=n+ad;++i)//reciclez c-ul si il pregatesc pt a pune ans ul in el
        c[i]=-1;

    q.clear();
    for(auto i:cap)
        if(g[i]==0)
        {
            q.push_back(i);
            for(auto j:elem[i])
            {
                c[j]=-1;//-1 e 0, 1 e 1
                c[-j]=1;
            }
        }

    topsort();
    for(int i=1;i<=n;++i)
        if(c[i]==-1)
            fout<<0<<" ";
        else
            fout<<1<<" ";
    return 0;
}