Cod sursa(job #1439190)

Utilizator tavonSuleyman Magnificul tavon Data 21 mai 2015 19:18:34
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int Nmax = 100001;
vector<int> G[2*Nmax],Gt[2*Nmax];
vector<int> Comp[2*Nmax];
vector<int> Gc[2*Nmax];
int f[2*Nmax],m[2*Nmax];
int Pof[2*Nmax],T[2*Nmax];
int sstabil[2*Nmax];
int N,M,K;
queue<int> q;
int no(int x){
    if(x>N) return x-N;
    else return x+N;
}
void dfs1(int x){
    m[x]=1;
    for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it){
        if(!m[*it]) dfs1(*it);
    }
    f[++f[0]]=x;
}
void dfs2(int x,int k){
    m[x]=1;
    Comp[k].push_back(x);
    Pof[x]=k;
    for(vector<int>::iterator it=Gt[x].begin();it!=Gt[x].end();++it){
        if(!m[*it]) dfs2(*it,k);
    }
}
int main(){
    in>>N>>M;
    int a,b;
    for(int i=1;i<=M;i++){
        in>>a>>b;
        if(a<0) a=-a+N;
        if(b<0) b=-b+N;
        G[no(a)].push_back(b);
        Gt[b].push_back(no(a));
        G[no(b)].push_back(a);
        Gt[a].push_back(no(b));
    }
    for(int i=1;i<=2*N;i++) if(!m[i]) dfs1(i);
    for(int i=1;i<=2*N;i++) m[i]=0;
    for(int i=f[0];i>=1;i--) if(!m[f[i]]) dfs2(f[i],++K);
    for(int i=1;i<=N;i++){
        if(Pof[i]==Pof[no(i)]){
            out<<"-1\n";
            return 0;
        }
    }
    for(int i=1;i<=2*N;i++){
        for(vector<int>::iterator it=G[i].begin();it!=G[i].end();++it){
            if(Pof[i]!=Pof[*it]){
                Gc[Pof[i]].push_back(Pof[*it]);
                T[Pof[*it]]++;
            }
        }
    }
    for(int i=1;i<=K;i++) if(!T[i]) q.push(i);
    while(!q.empty()){
        int x=q.front(); q.pop();
        if(!sstabil[x]){
            sstabil[x]=1;
            sstabil[ Pof[no(Comp[x][0])] ]=2;
        }
        for(vector<int>::iterator it=Gc[x].begin();it!=Gc[x].end();++it){
            T[*it]--;
            if(!T[*it]){
                q.push(*it);
            }
        }
    }
    out<<sstabil[Pof[1]]-1;
    for(int i=2;i<=N;i++) out<<' '<<sstabil[Pof[i]]-1;
    out<<'\n';
    return 0;
}