Cod sursa(job #1409059)

Utilizator teoionescuIonescu Teodor teoionescu Data 30 martie 2015 13:12:49
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int Nmax = 100000;
vector<int> G[2*Nmax+10];
#define G (G+Nmax+5)
vector<int> GT[2*Nmax+10];
#define GT (GT+Nmax+5)
int f[2*Nmax],m[2*Nmax];
#define m (m+Nmax+5)
vector<int> P[2*Nmax];
int N,M,K,T[2*Nmax],op[2*Nmax];
queue<int> q;
void dfs(int x){
    m[x]=1;
    for(vector<int>::iterator t=G[x].begin();t!=G[x].end();++t) if(!m[*t]) dfs(*t);
    f[++f[0]]=x;
}
void dfs2(int x,int k){
    m[x]=k;
    for(vector<int>::iterator t=GT[x].begin();t!=GT[x].end();++t) if(!m[*t]) dfs2(*t,k);
}
int main(){
    in>>N>>M;
    int x,y;
    for(int i=1;i<=M;i++){
        in>>x>>y;
        G[-x].push_back(y);
        GT[y].push_back(-x);
        G[-y].push_back(x);
        GT[x].push_back(-y);
    }
    m[0]=1;
    for(int i=-N;i<=N;i++) if(!m[i]) dfs(i);
    for(int i=-N;i<=N;i++) m[i]=0;
    for(int i=f[0];i>=1;i--) if(!m[f[i]]) dfs2(f[i],++K);
    for(int i=-N;i<=N;i++){
        for(vector<int>::iterator t=G[i].begin();t!=G[i].end();++t){
            if(m[i]!=m[*t]) P[m[i]].push_back(m[*t]);
        }
    }
    for(int i=1;i<=N;i++){
        if(m[i]==m[-i]){
            out<<"-1\n";
            return 0;
        }
        else{
            op[m[i]]=m[-i];
            op[m[-i]]=m[i];
        }
    }
    for(int i=1;i<=K;i++){
        for(vector<int>::iterator t=P[i].begin();t!=P[i].end();++t) T[*t]++;
    }
    for(int i=1;i<=K;i++){
        f[i]=-1;
        if(!T[i]) q.push(i);
    }
    while(!q.empty()){
        int x=q.front(); q.pop();
        if(f[x]==-1){
            f[x]=0,f[op[x]]=1;
            for(vector<int>::iterator t=P[x].begin();t!=P[x].end();++t){
                T[*t]--;
                if(!T[*t]) q.push(*t);
            }
        }
    }
    for(int i=1;i<=N;i++) out<<f[m[i]]<<' ';
    return 0;
}