Pagini recente » Cod sursa (job #1045582) | Cod sursa (job #2071980) | Cod sursa (job #2645005) | Cod sursa (job #1008847) | Cod sursa (job #1028694)
#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;
}