Pagini recente » Cod sursa (job #107349) | Cod sursa (job #433359) | Cod sursa (job #344796) | Cod sursa (job #943439) | Cod sursa (job #2527919)
#include <bits/stdc++.h>
#define DIM 200010
using namespace std;
ifstream fin ("2sat.in");
ofstream fout ("2sat.out");
vector <int> L[DIM],v;
int viz[DIM],low[DIM],niv[DIM],sol[DIM];
deque <int> s;
int n,m,i,x,y,xx,yy,idx,ok;
int convert (int x){
if (x > 0)
return x+n;
return -x;
}
int convert2 (int x){
if (x <= n)
return x+n;
return x-n;
}
void dfs (int nod){
viz[nod] = 1;
low[nod] = niv[nod] = ++idx;
s.push_back(nod);
for (auto vecin:L[nod]){
if (!niv[vecin]){
dfs (vecin);
low[nod] = min (low[nod],low[vecin]);
} else {
if (viz[vecin])
low[nod] = min (low[nod],low[vecin]);
}
}
if (low[nod] == niv[nod]){
/// am componenta tare conexa
/// toate nodurile din componenta trb sa aiba aceeasi valoare
int x;
v.clear();
do{
x = s.back();
s.pop_back();
v.push_back(x);
viz[x] = 0;
} while (x != nod);
int val = 1;
for (auto it:v){
if (sol[i] != -1){
val = sol[i];
break;
}}
/// le fac pe toate val
for (auto it:v){
if (sol[it] == 1-val)
ok = 1;
if (sol[convert2(it)] == val)
ok = 1;
sol[it] = val;
sol[convert2(it)] = 1-val;
}
}
}
int main (){
fin>>n>>m;
for (i=1;i<=m;i++){
fin>>x>>y;
xx = convert (x), yy = convert (y);
if (x < 0)
x = -x+n;
if (y < 0)
y = -y+n;
L[x].push_back(yy);
L[y].push_back(xx);
}
for (i=1;i<=2*n;i++)
sol[i] = -1;
for (i=1;i<=2*n;i++)
if (!viz[i])
dfs (i);
if (ok){
fout<<-1;
return 0;
}
for (i=1;i<=n;i++){
fout<<1-sol[i]<<" ";
}
return 0;
}