Cod sursa(job #1252687)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 31 octombrie 2014 00:19:40
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>
#include <deque>

#define Nmax 200100
#define pb push_back
#define non(x) ((x) <= N ? (x + N) : (x - N))
#define Neighbour Graph[Node][i]

using namespace std;

vector <int> Graph[Nmax], GraphT[Nmax];
deque <int> Deque;
bool Answer, used[Nmax], Mark[Nmax];
int N;

void Dfs(int Node) {

    if(Mark[Node]) {
        Answer = false;
        return;
        }

    used[Node] = false;
    Mark[non(Node)] = true;

    for(int i = 0; i < GraphT[Node].size(); i++)
        if(used[GraphT[Node][i]])
            Dfs(GraphT[Node][i]);

}
void topoSort(int Node) {

    used[Node] = true;

    for(int i = 0; i < Graph[Node].size(); i++)
        if(!used[Neighbour])
            topoSort(Neighbour);

    Deque.push_front(Node);

}
void Solve() {

    int Node;

    for(Node = 1; Node <= (N << 1); Node++)
        if(!used[Node])
            topoSort(Node);

    Answer = true;

    for(Node = 0; Answer && Node < (N << 1); Node++)
        if(used[Deque[Node]] && used[non(Deque[Node])])
            Dfs(Deque[Node]);

}
void Read() {

    int x, y, M;
    ifstream in("2sat.in");
    in >> N >> M;

    while(M--) {

        in >> x >> y;

        if(x < 0)
            x = N - x;
        if(y < 0)
            y = N - y;

        Graph[non(x)].pb(y);
        Graph[non(y)].pb(x);

        GraphT[x].pb(non(y));
        GraphT[y].pb(non(x));

        }

    in.close();

}
void Write() {

    ofstream out("2sat.out");

    if(!Answer)
        out << "-1";
    else
    for(int i = 1; i <= N; i++)
        out << Mark[i] << ' ';

    out << '\n';
    out.close();

}
int main() {

    Read();
    Solve();
    Write();

    return 0;

}