Cod sursa(job #1565419)

Utilizator 2chainzTauheed Epps 2chainz Data 10 ianuarie 2016 18:59:57
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int Nmax = 100001;
vector<int> G[2*Nmax],Gt[2*Nmax],C[2*Nmax],Tr[2*Nmax];
int m[2*Nmax],f[2*Nmax],T[2*Nmax],op[2*Nmax],sol[Nmax];
queue<int> q;
#define G (G+Nmax)
#define Gt (Gt+Nmax)
#define m (m+Nmax)
int N,M,K;
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){
    m[x]=K;
    C[K].push_back(x);
    for(vector<int>::iterator it=Gt[x].begin();it!=Gt[x].end();++it) if(!m[*it]) dfs2(*it);
}
int main(){
    in>>N>>M;
    for(int i=1;i<=M;i++){
        int x,y;
        in>>x>>y;
        G[-x].push_back(y),Gt[y].push_back(-x);
        G[-y].push_back(x),Gt[x].push_back(-y);
    }
    for(int i=-N;i<=N;i++) if(i!=0 && !m[i]) dfs1(i);
    for(int i=-N;i<=N;i++) m[i]=0;
    for(int i=f[0];i>=1;i--) if(!m[f[i]]) K++,dfs2(f[i]);
    for(int i=1;i<=N;i++){
        if(m[i]==m[-i]){ out<<"-1\n"; return 0; }
        op[m[i]]=m[-i];
        op[m[-i]]=m[i];
    }
    for(int i=1;i<=K;i++) f[i]=0;
    for(int i=1;i<=K;i++){
        for(vector<int>::iterator it=C[i].begin();it!=C[i].end();++it)
            for(vector<int>::iterator iit=G[*it].begin();iit!=G[*it].end();++iit)
                if(!f[m[*iit]] && i!=m[*iit]) f[m[*iit]]=1,Tr[i].push_back(m[*iit]);
        for(vector<int>::iterator it=C[i].begin();it!=C[i].end();++it)
            for(vector<int>::iterator iit=G[*it].begin();iit!=G[*it].end();++iit)
                f[m[*iit]]=0;
    }
    for(int i=1;i<=K;i++) for(vector<int>::iterator it=Tr[i].begin();it!=Tr[i].end();++it) T[*it]++;
    for(int i=1;i<=K;i++) if(!T[i]) q.push(i);
    while(!q.empty()){
        int i=q.front(); q.pop();
        if(!f[i]){
            f[i]=1,f[op[i]]=2;
            for(vector<int>::iterator it=Tr[i].begin();it!=Tr[i].end();++it){
                T[*it]--;
                if(!T[*it]) q.push(*it);
            }
        }
    }
    for(int i=1;i<=K;i++) if(f[i]==1) for(vector<int>::iterator it=C[i].begin();it!=C[i].end();++it) if(*it<0) sol[-(*it)]=1;
    for(int i=1;i<=N;i++) out<<sol[i]<<' '; out<<'\n';
    return 0;
}