Cod sursa(job #1028694)

Utilizator sziliMandici Szilard szili Data 14 noiembrie 2013 16:17:50
Problema 2SAT Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.88 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>

using namespace std;

int n,m;
int visitedNr = 1;
int startIndex;

int visitedOrder[200002];

vector<int> adjacencyList[200002];

int componentsNr = 0;
vector<int> components[200002];

int decidedValue[200002];

stack<int> st;

int getVariable(int a){
    return a-n;
}

int transformVariable(int a){
    return a+n;
}

int negateVariable(int a){
    return transformVariable(-getVariable(a));
}

int isNegative(int a){
    if (a<n){
        return 1;
    } else
        return 0;
}

void readData(){
    freopen("2sat.in", "r", stdin);
    freopen("2sat.out", "w", stdout);

    scanf("%d %d", &n, &m);

    int term1, term2;
    for (int i=0; i<m; i++){
        scanf("%d %d", &term1, &term2);

        term1 = transformVariable(term1);
        term2 = transformVariable(term2);

        adjacencyList[negateVariable(term1)].push_back(term2);
        adjacencyList[negateVariable(term2)].push_back(term1);
    }
}

int tarjan(int currentNode){
    st.push(currentNode);
    visitedOrder[currentNode] = visitedNr;
    visitedNr++;

    int minn = visitedOrder[currentNode];
    int aa;
    for (int i=0; i<adjacencyList[currentNode].size(); i++){
        int nextNode = adjacencyList[currentNode][i];

        if (!visitedOrder[nextNode]){
            aa = tarjan(nextNode);
            if (aa < minn){
                minn = aa;
            }
        } else if (startIndex <= visitedOrder[nextNode]) { // if is in stack
            if (visitedOrder[nextNode] < minn){
                minn = visitedOrder[nextNode];
            }
        }
    }

    if (visitedOrder[currentNode] == minn){
        //it is the root of a strongly connected component
          do {
            aa = st.top();
            st.pop();

            components[componentsNr].push_back(aa);
        }  while (aa != currentNode);

        componentsNr++;
    }

    return minn;
}

int main()
{
    readData();

    int ok = 1;

    for (int i=0; i<=2*n; i++){

        if (i!=n){
            if (!visitedOrder[i]){
                startIndex = visitedNr;
                tarjan(i);
            }
        }
    }


    for (int i=componentsNr-1; i>=0; i--){
        if (decidedValue[components[i][0]] != 1){
            for (int j=0; j<components[i].size(); j++){
                int currentNode = components[i][j];
                decidedValue[negateVariable(currentNode)] = 1;
            }
        }
    }

    for (int i=1; i<=2*n; i++){
        if (i != n && decidedValue[i] == decidedValue[negateVariable(i)]){
            ok = 0;
            break;
        }
    }

    if (ok){
        for (int i=n+1; i<=2*n; i++){
            printf("%d ", decidedValue[i]);
        }
    } else {
        printf("-1");
    }

    return 0;
}