Pagini recente » Cod sursa (job #1924835) | Cod sursa (job #2979066) | Istoria paginii preoni-2008/clasament/runda-3/9 | Cod sursa (job #925043) | Cod sursa (job #3231639)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
vector < vector <int> > G(200005);
vector < vector <int> > GT(200005);
vector <int> ord;
bitset <200005> viz;
int comp[200005];
int val[100005];
int c;
void dfs(int nod){
viz[nod] = 1;
for(auto x : G[nod]){
if(!viz[x]) dfs(x);
}
ord.push_back(nod);
}
void dfs2(int nod){
comp[nod] = c;
for(auto x : GT[nod]){
if(!comp[x]) dfs2(x);
}
}
int main()
{
int n,i,m,u,v;
fin >> n >> m;
while(m--){
fin >> u >> v;
//a si !a sa fie consecutive ca indici
if(u < 0) u = ((-u - 1) << 1) + 1;
else u = ((u - 1) << 1);
if(v < 0) v = ((-v - 1) << 1) + 1;
else v = ((v - 1) << 1);
G[u ^ 1].push_back(v);
G[v ^ 1].push_back(u);
GT[u].push_back(v ^ 1);
GT[v].push_back(u ^ 1);
}
for(i = 0; i < (n << 1); i++) if(!viz[i]) dfs(i);
reverse(ord.begin(), ord.end());
for(auto x : ord){
if(!comp[x]){
c++;
dfs2(x);
}
}
for(i = 0; i < (n << 1); i += 2){
if(comp[i] == comp[i + 1]){
fout << "-1";
return 0;
}
val[i >> 1] = comp[i] > comp[i + 1];
}
for(i = 0; i < n; i++) fout << val[i] << " ";
return 0;
}