Cod sursa(job #1182266)

Utilizator teoionescuIonescu Teodor teoionescu Data 5 mai 2014 17:47:59
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.91 kb
#include<fstream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<queue>
#define abs(x) ((x>0)?(x):(-(x)))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define ll long long
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int Nmax = 200001;
vector<int> G[Nmax];
#define G (G+100000)
vector<int> Gt[Nmax];
#define Gt (Gt+100000)
int mark[Nmax];
#define mark (mark+100000)
int N,M;
int f[Nmax];
vector<int> Ctc;
int Partof[Nmax];
#define Partof (Partof+100000)
int Comp[2*Nmax],Num;
vector<int> GC[2*Nmax];
int fat[2*Nmax],Reprez[2*Nmax];
void Dfs(int x){
    mark[x]=1;
    for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it){
        if(!mark[*it]) Dfs(*it);
    }
    f[++f[0]]=x;
}
void Dfst(int x){
    mark[x]=2;
    for(vector<int>::iterator it=Gt[x].begin();it!=Gt[x].end();++it){
        if(!mark[*it]) Dfst(*it);
    }
    Ctc.push_back(x);
}
queue<int> q;
int main(){
    in>>N>>M;
    for(int i=1;i<=M;i++){
        int x,y;
        in>>x>>y;
        G[-x].push_back(y);
        G[-y].push_back(x);
        Gt[y].push_back(-x);
        Gt[x].push_back(-y);
    }
    for(int i=-N;i<=-1;i++) if(!mark[i]) Dfs(i);
    for(int i=1;i<=N;i++) if(!mark[i]) Dfs(i);
    for(int i=-N;i<=N;i++) mark[i]=0;
    for(int i=f[0];i>=1;i--){
        Ctc.clear();
        if(!mark[f[i]]){
            Dfst(f[i]);
            for(vector<int>::iterator it=Ctc.begin();it!=Ctc.end();++it){
                if(mark[-(*it)]==2){
                    out<<"-1\n";
                    return 0;
                }
            }
            Num++;
            Reprez[Num]=Ctc[0];
            for(vector<int>::iterator it=Ctc.begin();it!=Ctc.end();++it){
                mark[*it]=1;
                Partof[*it]=Num;
            }
        }
    }
    for(int i=-N;i<=-1;i++){
        for(vector<int>::iterator it=G[i].begin();it!=G[i].end();++it){
            if(Partof[i]!=Partof[*it]){
                GC[ Partof[i] ].push_back( Partof[*it] );
                fat[Partof[*it]]++;
            }
        }
    }
    for(int i=1;i<=N;i++){
        for(vector<int>::iterator it=G[i].begin();it!=G[i].end();++it){
            if(Partof[i]!=Partof[*it]){
                GC[ Partof[i] ].push_back( Partof[*it] );
                fat[Partof[*it]]++;
            }
        }
    }
    for(int i=1;i<=Num;i++) if(!fat[i]) q.push(i);
    for(int i=1;i<=Num;i++) Comp[i]=-1;
    while(!q.empty()){
        int x=q.front(); q.pop();
        if(Comp[x]==-1){
            Comp[x]=0;
            Comp[Partof[-Reprez[x]]]=1;
            for(vector<int>::iterator it=GC[x].begin();it!=GC[x].end();++it){
                fat[*it]--;
                if(!fat[*it]) q.push(*it);
            }
        }
    }
    out<<Comp[Partof[1]];
    for(int i=2;i<=N;i++) out<<' '<<Comp[Partof[i]]; out<<'\n';
    return 0;
}