Cod sursa(job #3272822)

Utilizator Bolfa_DBolfa Diana Bolfa_D Data 31 ianuarie 2025 00:34:39
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.41 kb
#include <bits/stdc++.h>
#define NMAX 300200
#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;
int turn(int p)
{
    if(p<=n)
        return p;
    else return (p-ad)*-1;
}

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[i], c[x]);
            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;// !a
            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)
    {
        low[i]=MOD;
        disc[i]=MOD;
    }

    for(int i=1;i<=n+ad;++i)
        if(disc[i]==MOD && i!=n+1)
            dfs(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+10;++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])
                if(j<=n)
                {
                    c[j]=-1;//-1 e 0, 1 e 1
                    c[j+ad]=1;
                }
                else
                {
                    c[j]=-1;
                    c[j-ad]=1;
                }
        }

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