Pagini recente » Cod sursa (job #1751612) | Cod sursa (job #2154548) | Cod sursa (job #982468) | Cod sursa (job #2966959) | Cod sursa (job #2472641)
#include<iostream>
#include<vector>
#include<queue>
#include <fstream>
#define MAX_N 10000
using namespace std;
int n,m;
bool isVisited[2*MAX_N];
int SCC[2*MAX_N]; /// strongly connected components
int sign[2*MAX_N];
vector<int> neighbours[2*MAX_N];
vector<int> reverseNeighbours[2*MAX_N];
vector<int> visitOrder;
void Visit(int v){
if(isVisited[v])return;
isVisited[v] = true;
for(auto i = neighbours[v].begin(); i!=neighbours[v].end();i++){
Visit(*i);
}
visitOrder.push_back(v);
}
void Assaign(int v,int root){
if(SCC[v]==-1){
SCC[v] = root;
for(auto i = reverseNeighbours[v].begin();
i!=reverseNeighbours[v].end(); i++){
Assaign((*i),root);
}
}
}
int main(){
ofstream read;
read.open ("2sat.in");
ofstream print;
print.open ("2sat.out");
bool possibleSolution = true;
for(int i=0;i<MAX_N*2;i++){
SCC[i] = -1;
}
read>>n>>m;
int maxN = 2*n+1;
for(int i=0;i<m;i++){
int a,b;
read>>a>>b;
neighbours[n-a].push_back(n+b);
neighbours[n-b].push_back(n+a);
reverseNeighbours[n+b].push_back(n-a);
reverseNeighbours[n+a].push_back(n-b);
}
for(int i=0;i<maxN;i++){
if(i==n)continue;
if(!isVisited[i]){
Visit(i);
}
}
for(auto i = visitOrder.end()-1; i>=visitOrder.begin();i--){
Assaign((*i),(*i));
}
for(auto i = visitOrder.end()-1; i>=visitOrder.begin()&&possibleSolution;i--){
int current = (*i);
int other = 2*n-current;
if(sign[current]==0){
if(SCC[current]==SCC[other]){
possibleSolution=false;
}
sign[current] = 1;
sign[other] = -1;
}
}
if(possibleSolution){
for(int i=0;i<n;i++){
if(sign[i]==-1){
print<<0;
}else if(sign[i]==1){
print<<1;
}
print<<" ";
}
}else{
print<<"No Solution";
}
read.close();
print.close();
return 0;
}