Cod sursa(job #3239025)

Utilizator andreea678Rusu Andreea-Cristina andreea678 Data 1 august 2024 14:43:39
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100005
using namespace std;

ifstream fin("2sat.in");
ofstream fout("2sat.out");
int N, M;
int x,y;
int val[NMAX * 2]; ///toate valorile sunt 0 initial
bool vizitat[NMAX * 2];
bool exista=true; ///exista sau nu solutie
stack<int> stiva;
vector<vector<int>> gr, grt;
int non(int nod){
    if (nod > N){
        return nod - N;
    }
    else{
        return nod + N;
    }
}
void DFS(int nod){
    vizitat[nod]=true;
    for(int i: gr[nod]){
        if (vizitat[i]==false){
            DFS(i);
        }
    }
    stiva.push(nod);
}
void DFST(int nod){
    vizitat[nod]=true;
    if (val[nod]==true){ ///vin dintr-un nod cu 0 intr-unul cu 1, fals
        exista=false;
    }
    val[non(nod)]=true; ///pentru ca initial toate sunt pe 0, trebuie sa setez non pe 1
    for(int i: grt[nod]){
        if (vizitat[i]==false){
            DFST(i);
        }
    }
}
int main()
{
    fin >> N >> M;
    gr.resize(2*N+1);
    grt.resize(2*N+1);
    for(int i=1; i<=M; ++i){
        fin >> x >> y;
        if (x<0){
            x = N - x;
        }
        if (y<0){
            y = N - y;
        }
        gr[non(x)].push_back(y);
        gr[non(y)].push_back(x);
        grt[y].push_back(non(x));
        grt[x].push_back(non(y));
    }
    for(int i=1; i<= 2 * N; ++i){
        if (vizitat[i]==false){
            DFS(i);
        }
    }
    for(int i=1; i<= 2*N; ++i){
        vizitat[i]=false; ///resetez vizitatul
    }
    while(!stiva.empty()){
        int nod = stiva.top();
        stiva.pop();
        if(vizitat[nod]==false && vizitat[non(nod)]==false){
            DFST(nod);
        }
    }
    if (exista==false){
        fout << -1 << '\n';
    }
    else{
        for(int i=1; i<=N; ++i){
            fout << val[i] << ' ';
        }
    }
    return 0;
}