Cod sursa(job #3257313)

Utilizator Ilinca_Radu_2022Radu Ilinca-Rucsandra Ilinca_Radu_2022 Data 17 noiembrie 2024 12:48:50
Problema 2SAT Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
#define MAX 100000
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int i, nr, n, m, x, y, viz[2*MAX+5], r[2*MAX+5], x1, x2, yy1, y2;
vector<int>v[2*MAX+5], t[2*MAX+5], s;
void dfs(int i, int nr) {
    viz[i]=nr;
    for (int j:v[i]) {
        if (viz[j]==0) dfs(j, nr);
    }
    s.push_back(i);
}
void dfs2(int i, int nr) {
    viz[i]=nr;
    for (int j:t[i]) {
        if (viz[j]==0) dfs(j, nr);
    }
}
int main()
{
    fin>>n>>m;
    for (i=1; i<=m; i++) {
        fin>>x>>y;
        if (x < 0) x1 = -x, x2 = n - x;
        else x1 = n + x, x2 = x;
        if (y < 0) yy1 = -y, y2 = n - y;
        else yy1 = n + y, y2 = y;

        v[x2].push_back(yy1);
        v[y2].push_back(x1);
        t[yy1].push_back(x2);
        t[x1].push_back(y2);
    }
    for (i=1; i<=2*n; i++) {
        if (viz[i]==0) dfs(i, 1);
    }
    for (i=1; i<=2*n; i++) viz[i]=0;
    nr=0;
    while (!s.empty()) {
        i=s.back();
        s.pop_back();
        if (viz[i]==0) {
            dfs2(i, ++nr);
        }
    }
    for (i=1; i<=n; i++) {
        if (viz[i]==viz[n+i]) {
            fout<<-1;
            return 0;
        }
    }
    for (i=1; i<=n; i++) {
        if (viz[i] > viz[n+i]) fout << 0 << ' ';
        else fout<< 1 <<' ';
    }
    return 0;
}