Pagini recente » Cod sursa (job #2210467) | Istoria paginii runda/fminostressrecap | Cod sursa (job #2254958) | Cod sursa (job #2641528) | Cod sursa (job #2797804)
#include <fstream>
#include <vector>
std::ifstream in("2sat.in");
//std::ifstream in("test.in");
std::ofstream out("2sat.out");
//std::ofstream out("test.out");
const int N = 2e5+1;
int n, m, nrCtc;
std::vector<int> g1[N], g2[N];
int sortTop[N], ctc[N];
bool vis[N], value[N/2];
void dfs(int i){
static int cnt = 0;
vis[i] = 1;
for(auto node : g1[i]){
if(vis[node]) continue;
dfs(node);
}
sortTop[cnt++] = i;
}
void reset_vis(){
int lim = 2*n-1;
for(int i=0;i<=lim;++i)
vis[i] = 0;
}
void makeCtc(int i){
vis[i] = 1;
for(auto node : g2[i]){
if(vis[node]) continue;
makeCtc(node);
}
ctc[i]=nrCtc;
}
bool solve(){
int lim = 2*n-1;
for(int i=0;i<=lim;++i){
if(vis[i]) continue;
dfs(i);
}
reset_vis();
for(int i=lim;i>=0;--i){
if(vis[sortTop[i]]) continue;
makeCtc(sortTop[i]);
++nrCtc;
}
for(int i=0;i <= lim; i += 2){
if(ctc[i] == ctc[i+1]){
return 0;
}
value[i/2] = ctc[i] > ctc[i+1];
}
return 1;
}
int main(){
in>>n>>m;
for(int i=0;i<m;++i){
int a, na, b, nb;
in>>a>>b; // a || b => !a -> b && !b -> a
// notam !a cu indicele 2a+1 si a cu 2a
if(a<0){
a = (-a - 1)*2 + 1;
na = a-1;
}
else{
a = 2*(a-1);
na = a+1;
}
if(b<0){
b = (-b - 1)*2 + 1;
nb = b-1;
}
else{
b = 2*(b-1);
nb = b+1;
}
g1[na].push_back(b);
g1[nb].push_back(a);
g2[b].push_back(na);
g2[a].push_back(nb);
}
bool ok = solve();
if(!ok){
out<<-1;
return 0;
}
for(int i=0;i<n;++i){
out<<value[i]<<' ';
}
in.close();
out.close();
return 0;
}