Cod sursa(job #2003309)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 22 iulie 2017 17:13:30
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
#define MAXN 200000

std::vector <int> g[MAXN + 1], rev[MAXN + 1];
std::vector <int> top;

int n;

inline int check(int nod) {
    if(nod < 0)
        nod += 2 * n;
    else
        nod--;
    return nod;
}

bool viz[MAXN + 1];

void dfs1(int nod) {
    viz[nod] = 1;
    for(auto it : g[nod])
        if(viz[it] == 0)
           dfs1(it);
    top.push_back(nod);
}

int pos[MAXN + 1];
int cnt = 0;

void dfs2(int nod) {
    viz[nod] = 1;
    pos[nod] = cnt;
    for(auto it : rev[nod])
        if(viz[it] == 0)
           dfs2(it);
}

int main(){
    FILE *fi, *fout;
    int i, m, x, y;
    fi = fopen("2sat.in" ,"r");
    fout = fopen("2sat.out" ,"w");
    fscanf(fi,"%d %d " ,&n,&m);
    for(i = 1; i <= m; i++) {
        fscanf(fi,"%d %d " ,&x,&y);
        g[check(-x)].push_back(check(y));
        g[check(-y)].push_back(check(x));
        rev[check(y)].push_back(check(-x));
        rev[check(x)].push_back(check(-y));
    }
    for(i = 0; i < 2 * n; i++)
        if(viz[i] == 0)
           dfs1(i);
    memset(viz, 0, sizeof(viz));
    for(i = top.size() - 1; i >= 0; i--)
        if(viz[top[i]] == 0) {
           cnt++;
           dfs2(top[i]);
        }
    for(i = 1; i <= n; i++)
       if(pos[check(i)] == pos[check(-i)]) {
           fprintf(fout,"-1");
           return 0;
       }
    for(i = 1; i <= n; i++)
       fprintf(fout,"%d " ,pos[check(i)] > pos[check(-i)]);
    fclose(fi);
    fclose(fout);
    return 0;
}