Cod sursa(job #2985035)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 25 februarie 2023 15:50:43
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;

ifstream cin("2sat.in");
ofstream cout("2sat.out");

const int NMAX = 2e5 + 1;

int m;

vector<int> vecini[NMAX],t[NMAX],topo;
bool viz[NMAX]; int care[NMAX],e;

void dfs(int nod)
{
    viz[nod] = 1;
    for(auto it : vecini[nod])
        {
            if(viz[it]) continue;
            dfs(it);
        }

    topo.emplace_back(nod);
}

int getint()
{
    int x; cin >> x; return x;

}

int falseval(int x)
{
    if(x < 0) return -x + m;
    return x;
}

int negativ(int x)
{
    return x > m ? x - m : x + m;
}

void cauta(int nod)
{
    care[nod] = e;
    for(auto it : t[nod])
        {
            if(care[it]) continue;
            cauta(it);
        }
}


int main()
{
    int n,x; cin >> m >> n;
    for(int i = 1; i <= n ; i++)
        {
           int a,b; a = falseval(getint());
                    b = falseval(getint());

           vecini[negativ(a)].emplace_back(b);
           vecini[negativ(b)].emplace_back(a);
           t[b].emplace_back(negativ(a));
           t[a].emplace_back(negativ(b));

        }

    for(int i = 1; i <= 2 * m ; i++)
        {
            if(viz[i]) continue;
            dfs(i);
        }

    for(auto it = topo.rbegin() ; it != topo.rend() ; it++)
        {
            if(care[*it]) continue;
            e++; cauta(*it);
        }

    queue<string> ans;
    for(int i = 1; i <= m ; i++)
        {
            if(care[i] == care[i + m]) break;
            ans.push(care[i] > care[i + m] ? "1 " : "0 ");
        }

    if(ans.size() != m)
        {
            cout << -1;
            return 0;
        }

    while(!ans.empty())
        {
            cout << ans.front(); ans.pop();
        }
}