Cod sursa(job #1374943)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 5 martie 2015 11:28:59
Problema 2SAT Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=100000;
vector<int>g[2*N+1];
vector<int>h[2*N+1];
int q[2*N+1];
int st[4*N+1];
bool vis[2*N+1];
int repr[2*N+1];
bool stacked[2*N+1];
int whose[2*N+1];
bool colour[2*N+1];
int n,m;
int nctc;
int top;
int inv(int x){
    if(x>n)
        return x-n;
    return x+n;
}
void dfs(int dad){
    vis[dad]=true;
    for(unsigned int i=0;i<g[dad].size();i++){
        int son=g[dad][i];
        if(!vis[son])
            dfs(son);
    }
    st[++top]=dad;
    stacked[dad]=true;
}
void bfs(int node){
    int l=1,r=1;
    q[1]=node;
    whose[node]=nctc;
    vis[node]=true;
    repr[nctc]=node;
    while(l<=r){
        int dad=q[l++];
        for(unsigned int i=0;i<h[dad].size();i++){
            int son=h[dad][i];
            if(!vis[son]&&stacked[son]){
                q[++r]=son;
                vis[son]=true;
                whose[son]=nctc;
                stacked[son]=false;
            }
        }
    }
}
int main(){
    freopen("2sat.in","r",stdin);
    freopen("2sat.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        if(x<0)
            x=-x+n;
        if(y<0)
            y=-y+n;
        g[inv(x)].push_back(y);
        g[inv(y)].push_back(x);
        h[y].push_back(inv(x));
        h[x].push_back(inv(y));
    }
    for(int i=1;i<=2*n;i++)
        if(!vis[i])
            dfs(i);
    memset(vis,0,sizeof(vis));
    while(top){
        if(stacked[st[top]]){
            nctc++;
            bfs(st[top]);
        }
        top--;
    }
    for(int i=1;i<=n;i++)
        if(whose[i]==whose[n+i]){
            printf("-1");
            return 0;
        }
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=nctc/2;i++)
        if(!vis[i]&&!vis[whose[inv(repr[i])]]){
            colour[whose[inv(repr[i])]]=true;
            vis[i]=true;
            vis[whose[inv(repr[i])]]=true;
        }
    for(int i=1;i<=n;i++)
        if(colour[whose[i]])
            printf("1 ");
        else
            printf("0 ");
    return 0;
}