Pagini recente » Cod sursa (job #1354827) | Cod sursa (job #3288095) | Cod sursa (job #3285371) | Cod sursa (job #12266) | Cod sursa (job #3239025)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100005
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int N, M;
int x,y;
int val[NMAX * 2]; ///toate valorile sunt 0 initial
bool vizitat[NMAX * 2];
bool exista=true; ///exista sau nu solutie
stack<int> stiva;
vector<vector<int>> gr, grt;
int non(int nod){
if (nod > N){
return nod - N;
}
else{
return nod + N;
}
}
void DFS(int nod){
vizitat[nod]=true;
for(int i: gr[nod]){
if (vizitat[i]==false){
DFS(i);
}
}
stiva.push(nod);
}
void DFST(int nod){
vizitat[nod]=true;
if (val[nod]==true){ ///vin dintr-un nod cu 0 intr-unul cu 1, fals
exista=false;
}
val[non(nod)]=true; ///pentru ca initial toate sunt pe 0, trebuie sa setez non pe 1
for(int i: grt[nod]){
if (vizitat[i]==false){
DFST(i);
}
}
}
int main()
{
fin >> N >> M;
gr.resize(2*N+1);
grt.resize(2*N+1);
for(int i=1; i<=M; ++i){
fin >> x >> y;
if (x<0){
x = N - x;
}
if (y<0){
y = N - y;
}
gr[non(x)].push_back(y);
gr[non(y)].push_back(x);
grt[y].push_back(non(x));
grt[x].push_back(non(y));
}
for(int i=1; i<= 2 * N; ++i){
if (vizitat[i]==false){
DFS(i);
}
}
for(int i=1; i<= 2*N; ++i){
vizitat[i]=false; ///resetez vizitatul
}
while(!stiva.empty()){
int nod = stiva.top();
stiva.pop();
if(vizitat[nod]==false && vizitat[non(nod)]==false){
DFST(nod);
}
}
if (exista==false){
fout << -1 << '\n';
}
else{
for(int i=1; i<=N; ++i){
fout << val[i] << ' ';
}
}
return 0;
}