Cod sursa(job #2797804)

Utilizator Albert_GAlbert G Albert_G Data 10 noiembrie 2021 16:51:04
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
#include <vector>

std::ifstream in("2sat.in");
//std::ifstream in("test.in");
std::ofstream out("2sat.out");
//std::ofstream out("test.out");

const int N = 2e5+1;
int n, m, nrCtc;
std::vector<int> g1[N], g2[N];
int sortTop[N], ctc[N];
bool vis[N], value[N/2];

void dfs(int i){
    static int cnt = 0;
    vis[i] = 1;
    for(auto node : g1[i]){
        if(vis[node]) continue;
        dfs(node);
    }
    sortTop[cnt++] = i;
}

void reset_vis(){
    int lim = 2*n-1;
    for(int i=0;i<=lim;++i)
        vis[i] = 0;
}

void makeCtc(int i){
    vis[i] = 1;
    for(auto node : g2[i]){
        if(vis[node]) continue;
        makeCtc(node);
    }
    ctc[i]=nrCtc;
}

bool solve(){
    int lim = 2*n-1;
    for(int i=0;i<=lim;++i){
        if(vis[i]) continue;
        dfs(i);
    }
    reset_vis();
    for(int i=lim;i>=0;--i){
        if(vis[sortTop[i]]) continue;
        makeCtc(sortTop[i]);
        ++nrCtc;
    }
    for(int i=0;i <= lim; i += 2){
        if(ctc[i] == ctc[i+1]){
            return 0;
        }
        value[i/2] = ctc[i] > ctc[i+1];
    }
    return 1;
}

int main(){
    in>>n>>m;
    for(int i=0;i<m;++i){
        int a, na, b, nb;
        in>>a>>b; // a || b =>  !a -> b && !b -> a
        // notam !a cu indicele 2a+1 si a cu 2a
        if(a<0){
            a = (-a - 1)*2 + 1;
            na = a-1;
        }
        else{
            a = 2*(a-1);
            na = a+1;
        }
        if(b<0){
            b = (-b - 1)*2 + 1;
            nb = b-1;
        }
        else{
            b = 2*(b-1);
            nb = b+1;
        }
        g1[na].push_back(b);
        g1[nb].push_back(a);
        g2[b].push_back(na);
        g2[a].push_back(nb);
    }
    bool ok = solve();
    if(!ok){
        out<<-1;
        return 0;
    }
    for(int i=0;i<n;++i){
        out<<value[i]<<' ';
    }
    in.close();
    out.close();
    return 0;
}