Cod sursa(job #1854718)

Utilizator ade_tomiEnache Adelina ade_tomi Data 23 ianuarie 2017 09:55:58
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 200004;
vector <int> v[NMAX], st, vt[NMAX];
int sol[NMAX], viz[NMAX], viz2[NMAX], n, m, x, y, ok;
int non(int x)
{

    if (x <= n)
        return x + n;
   return x - n;
}
void dfs(int k)
{
    viz[k] = 1;
    for (int i = 0; i < v[k].size(); i ++)
        if (viz[v[k][i]] == 0)
            dfs(v[k][i]);
    st.push_back(k);
}
void dfs2(int k)
{

  // cout <<"k = " << k <<" " << non(k) <<  "\n";
    if (sol[k] == 1)
        ok  = 1;
    sol[non(k)] = 1;
    viz[k] = 0;
    for (int i = 0; i < vt[k].size(); i++)
        if (viz[vt[k][i]] == 1)
            dfs2(vt[k][i]);
}

int main ()
{
    ifstream cin ("2sat.in");
    ofstream cout ("2sat.out");
    cin >> n >> m;
//cout << n << " " << m << "\n";
    for (int i = 1; i <= m; i++)
    {
        cin >> x >> y;
        if (x < 0)
            x = non(-x);
        if (y < 0)
            y = non(-y);
       // cout << x << " " << y << " " << non(x) << " " << non(y) << "\n";
        v[non(x)].push_back(y);
        v[non(y)].push_back(x);
        vt[x].push_back(non(y));
        vt[y].push_back(non(x));
    }
    for (int i = 1; i <= n * 2; i++)
    {
        //cout << viz[i] << " ";
        if (viz[i] == 0)
            dfs(i);
    }
 /*   cout << st.size() << "\n";
    for (int i = st.size() - 1; i >= 0; i--)
        cout << st[i] << " ";
    cout << "\n";*/
    for (int i = st.size() - 1; i >= 0; i--)
        if(viz[st[i]] && viz[non(st[i])])
            dfs2(st[i]);

    if (ok == 1)
    {
        cout << "-1";
        return 0;
    }
    for (int i = 1; i <= n; i++)
        cout << sol[i] << " ";
    return 0;
}