Cod sursa(job #2474289)

Utilizator a.zadgorsky@gmail.com0882517140 [email protected] Data 14 octombrie 2019 22:45:12
Problema 2SAT Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.43 kb
#include <iostream>
#include <vector>
#include <stack>
#include <fstream>
using namespace std;
long long n, m, l[400000], index[400000], br, br1, vKomp[400000];
vector <int> sused[400000], comp[400000];
bool inStack[400000], otg[400000], imameOtg[400000], stop=false;
stack <int> st;
void dfs(int x){
    inStack[x]=true;
    st.push(x);
    index[x]=br;
    l[x]=br;
    br++;
    for(int i=0;i<sused[x].size();i++){
        int nov=sused[x][i];
        if(index[nov]==-1){
            dfs(nov);
            l[x]=min(l[nov], l[x]);
        }else if(inStack[nov]){
            l[x]=min(l[nov], l[x]);
        }
    }
    if(l[x]==index[x]){
        bool j=false;
        while(!st.empty() and !j){
            if(st.top()==x){
                j=true;
            }
            comp[br1].push_back(st.top());
            inStack[st.top()]=false;
            st.pop();
        }
        br1++;
    }
}
void napraviTakavaComp(bool dadeno, int nomer){
    ofstream fileout;
    fileout.open("2sat.out");
    ifstream filein;
    filein.open("2sat.in");
    if(stop){
        return;
    }
    for(int i=0;i<comp[nomer].size();i++){
        if(imameOtg[comp[nomer][i]]){
            if(otg[comp[nomer][i]]!=dadeno){
                //cout<<"-1";
                fileout<<"-1";
                stop=true;
            }
        }else{
            imameOtg[comp[nomer][i]]=true;
            otg[comp[nomer][i]]=dadeno;
            if(comp[nomer][i]<=200000){
                if(!imameOtg[comp[nomer][i]+200000]){
                    imameOtg[comp[nomer][i]+200000]=true;
                    otg[comp[nomer][i]+200000]=!dadeno;
                    napraviTakavaComp(!dadeno, vKomp[comp[nomer][i]+200000]);
                }else{
                    if(otg[comp[nomer][i]+200000]==otg[comp[nomer][i]]){
                        //cout<<"-1";
                        fileout<<"-1";
                        stop=true;
                    }
                }
            }else{
                if(!imameOtg[comp[nomer][i]-200000]){
                    imameOtg[comp[nomer][i]-200000]=true;
                    otg[comp[nomer][i]-200000]=!dadeno;
                    napraviTakavaComp(!dadeno, vKomp[comp[nomer][i]-200000]);
                }else{
                    if(otg[comp[nomer][i]-200000]==otg[comp[nomer][i]]){
                        //cout<<"-1";
                        fileout<<"-1";
                        stop=true;
                    }
                }
            }
        }
    }
}
int main(){
ofstream fileout;
fileout.open("2sat.out");
ifstream filein;
filein.open("2sat.in");
//cin>>n>>m;
filein>>n>>m;
for(int i=0;i<m;i++){
    int x, y, minusX, minusY, X, Y;
    //cin>>x>>y;
    filein>>x>>y;
    if(-x<0){
        minusX=x+200000;
    }else{
        minusX=-x;
    }
    if(x<0){
        X=-x+200000;
    }else{
        X=x;
    }
    if(-y<0){
        minusY=y+200000;
    }else{
        minusY=-y;
    }
    if(y<0){
        Y=-y+200000;
    }else{
        Y=y;
    }
    sused[minusX].push_back(Y);
    sused[minusY].push_back(X);
}
for(int i=200001;i<=200000+n;i++){
    index[i]=-1;
    l[i]=-1;
}
for(int i=1;i<=n;i++){
    index[i]=-1;
    l[i]=-1;
}
for(int i=200001;i<=200000+n;i++){
    if(index[i]==-1){
        dfs(i);
    }
}
for(int i=1;i<=n;i++){
    if(index[i]==-1){
        dfs(i);
    }
}
for(int i=0;i<br1;i++){
    for(int j=0;j<comp[i].size();j++){
        vKomp[comp[i][j]]=i;
    }
}
for(int i=0;i<br1;i++){
    for(int j=0;j<comp[i].size();j++){
        if(!imameOtg[comp[i][j]]){
            imameOtg[comp[i][j]]=true;
            otg[comp[i][j]]=true;
            napraviTakavaComp(true, vKomp[comp[i][j]]);
            if(stop){
                return 0;
            }
            if(comp[i][j]<=200000){
                imameOtg[comp[i][j]+200000]=true;
                otg[comp[i][j]+200000]=false;
                napraviTakavaComp(false, vKomp[comp[i][j]+200000]);
                if(stop){
                    return 0;
                }
            }else{
                imameOtg[comp[i][j]-200000]=true;
                otg[comp[i][j]-200000]=false;
                napraviTakavaComp(false, vKomp[comp[i][j]-200000]);
                if(stop){
                    return 0;
                }
            }
        }
    }
}
for(int i=1;i<=n;i++){
    //cout<<otg[i]<<" ";
    fileout<<otg[i]<<" ";
}
return 0;
}