Cod sursa(job #2921280)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 29 august 2022 21:15:22
Problema 2SAT Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.62 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin ("2sat.in");
ofstream fout("2sat.out");

const int dim=1e5+9;

struct elem{int x,y;}expr[dim];
vector<int>g[dim],ct[dim];

int n,m;
int ans[dim],aux[dim];

bool verifica_pereche(elem t){
    int x=aux[abs(t.x)];
    int y=aux[abs(t.y)];

    if(t.x<0){
        x^=1;
    }
    if(t.y<0){
        y^=1;
    }
    return x|y;
}

bool vizitat[dim];

bool valid(int t){
    queue<int>q;
    fill(vizitat+1,vizitat+n+1,false);
    vizitat[t]=true;
    q.push(t);
    while(!q.empty()){
        int x=q.front();
        for(int i=0;i<g[x].size();i++){
            int y=abs(g[x][i]);
            int nr=ct[x][i];
            if(!vizitat[y]){
                int anterior=aux[y];
                bool ok=false;
                aux[y]=0;
                if(!verifica_pereche(expr[nr])){
                    ok=true;
                }
                aux[y]=1;
                if(!verifica_pereche(expr[nr])){
                    ok=true;
                }
                if(ok){
                    aux[y]=0;
                    if(!verifica_pereche(expr[nr])){
                        aux[y]=1;
                    }
                    q.push(y);
                    vizitat[y]=true;
                }else{
                    aux[y]=anterior;
                }
            }else{
                if(!verifica_pereche(expr[nr])){
                    return false;
                }
            }
        }
        q.pop();
    }
    return true;
}

signed main(){
        fin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y;
        fin>>x>>y;
        expr[i].x=x,expr[i].y=y;
        g[abs(x)].push_back(y);
        g[abs(y)].push_back(x);
        ct[abs(x)].push_back(i);
        ct[abs(y)].push_back(i);
    }
    fill(ans+1,ans+n+1,-1);
    for(int i=1;i<=n;i++){
        if(ans[i]==-1){
            ans[i]=0;
            memcpy(aux,ans,sizeof(ans));
            if(!valid(i)){
                ans[i]=1;
                memcpy(aux,ans,sizeof(ans));
                if(!valid(i)){
                    fout<<-1;
                    return 0;
                }
            }
            memcpy(ans,aux,sizeof(ans));
        }else{
            memcpy(aux,ans,sizeof(ans));
            if(!valid(i)){
                ans[i]^=1;
                //memcpy(aux,ans,sizeof(ans));
                if(!valid(i)){
                    fout<<-1;
                    return 0;
                }
            }
            memcpy(ans,aux,sizeof(ans));
        }
    }
    for(int i=1;i<=n;i++){
        fout<<ans[i]<<' ';
    }
}