Pagini recente » Borderou de evaluare (job #2271567) | Cod sursa (job #1403262) | Cod sursa (job #3232228) | Cod sursa (job #2654463) | Cod sursa (job #3137088)
#include <bits/stdc++.h>
#define eb emplace_back
#define cin in
#define cout out
using namespace std;
const string file_name("2sat");
ifstream in(file_name + ".in");
ofstream out(file_name + ".out");
const int NMAX = 2e5;
vector <int> g[NMAX + 1], rg[NMAX + 1], topsort, comp;
int n, ctc, m, x, y;
bitset <NMAX + 1> viz;
int val_asoc(int x)
{
return x<0 ? -x+n : x;
}
int neg(int x)
{
return x<=n ? x+n : x-n;
}
void dfs(int k)
{
viz[k] = 1;
for(auto x : g[k])
if(!viz[x])
dfs(x);
topsort.eb(k);
}
void dfs2(int k)
{
comp[k] = ctc;
for(auto x : rg[k])
if(!comp[x])
dfs2(x);
}
int main()
{
cin >> n >> m;
comp.resize(2*(n+1));
for(int i = 0; i < m; i++)
{
cin >> x >> y;
x = val_asoc(x);
y = val_asoc(y);
g[neg(x)].eb(y);
g[neg(y)].eb(x);
rg[y].eb(neg(x));
rg[x].eb(neg(y));
}
for(int i = 1; i <= 2 * n; i++)
if(!viz[i]) dfs(i);
reverse(topsort.begin(), topsort.end());
for(auto x : topsort)
{
if(comp[x]) continue;
ctc++;
dfs2(x);
}
bool ok=1;
for(int i=1;i<=n and ok;i++)
if(comp[i]==comp[i+n]) ok=0;
if(!ok) cout<<-1;
else
{
for(int i=1;i<=n;i++)
cout<<(comp[i]>comp[n+i] ? 1 : 0)<<' ';
}
return 0;
}