Cod sursa(job #1463593)

Utilizator TeodorescuStefanEduardTeodorescu Stefan Eduard TeodorescuStefanEduard Data 21 iulie 2015 12:23:26
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
##include <bits/stdc++.h>
 
using namespace std;
 
class SAT2
{
public:
 
    explicit SAT2(){
    }
 
    SAT2(const int n)
    {
        N = n;
        p = 0;
 
        G.resize(2 * N + 1);
        GT.resize(2 * N + 1);
        solution.resize(2 * N + 1);
 
        postorder.resize(2 * N + 1);
        visited.resize(2 * N + 1);
    }
 
    int Not(const int x) const
    {
        if (x > N)
            return x - N;
        else
            return x + N;
    }
 
    void addEdge(int x, int y)
    {
        if (x < 0) x = -x + N;
        if (y < 0) y = -y + N;
 
        G[Not(x)].push_back(y);
        GT[y].push_back(Not(x));
 
        G[Not(y)].push_back(x);
        GT[x].push_back(Not(y));
    }
 
    void dfs(int nod)
    {
        visited[nod] = true;
 
        for (auto it: G[nod])
            if (!visited[it])
                dfs(it);
 
        postorder[ ++p ] = nod;
    }
 
    void dfsT(int nod)
    {
        visited[nod] = false;
        solution[Not(nod)] = true;
 
        for (auto it: GT[nod])
            if (visited[it])
                dfsT(it);
    }
 
    void solve()
    {
        for (int i = 1; i <= 2 * N; ++i)
            if (!visited[i])
                dfs(i);
 
        for (int i = 2 * N; i >= 1; --i)
        {
            int nod = postorder[i];
 
            if (visited[nod] && visited[Not(nod)])
                dfsT(nod);
        }
    }
 
    bool isSolution() const
    {
        for (int i = 1; i <= N; ++i)
            if (solution[i] && solution[Not(i)])
                return false;
 
        return true;
    }
 
    int N, p;
    vector<vector<int>> G, GT;
    vector<bool> solution;
 
    vector<int> postorder;
    vector<bool> visited;
};
 
int main()
{
    ifstream in("2sat.in");
    ofstream out("2sat.out");
 
    int N, M;
    in >> N >> M;
 
    SAT2 S(N);
 
    while (M--)
    {
        int x, y;
        in >> x >> y;
 
        S.addEdge(x, y);
    }
 
    S.solve();
 
    if (S.isSolution())
    {
        for (int i = 1; i <= S.N; ++i)
            out << S.solution[i] << " ";
    }
    else
        out << "-1\n";
 
    return 0;
}