Pagini recente » Istoria paginii utilizator/an3tjm | Cod sursa (job #1239864) | Cod sursa (job #868302) | Istoria paginii template/preoni-2008/runda-finala/probleme | Cod sursa (job #2797795)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int n, m;
bool viz[200200];
vector<int> v[200200];
vector<int> inv[200200];
vector<int> ordine;
int ctc;
int idx_ctc[200200];
void dfs(int nod)
{
viz[nod] = true;
for(auto it : v[nod])
{
if(!viz[it])
{
dfs(it);
}
}
ordine.push_back(nod);
}
void dfs2(int nod)
{
viz[nod] = false;
idx_ctc[nod] = ctc;
for(auto it : inv[nod])
{
if(viz[it])
{
dfs2(it);
}
}
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= m; i ++)
{
int x, y;
int a, b, not_a, not_b;
fin >> x >> y;
if(x > 0)
{
a = 2 * x;
not_a = 2 * x + 1;
}
else
{
a = - 2 * x + 1;
not_a = - 2 * x;
}
if(y > 0)
{
b = 2 * y;
not_b = 2 * y + 1;
}
else
{
b = -2 * y + 1;
not_b = -2 * y;
}
v[not_a].push_back(b);
v[not_b].push_back(a);
inv[b].push_back(not_a);
inv[a].push_back(not_b);
}
for(int i = 2; i <= 2 * n + 1; i ++)
{
if(!viz[i])
{
dfs(i);
}
}
reverse(ordine.begin(), ordine.end());
for(auto it : ordine)
{
if(viz[it])
{
ctc++;
dfs2(it);
}
}
vector<int> ans;
for(int i = 2; i <= 2 * n; i += 2)
{
if(idx_ctc[i] == idx_ctc[i + 1])
{
fout << -1;
return 0;
}
ans.push_back(idx_ctc[i] > idx_ctc[i + 1]);
}
for(auto it : ans)
{
fout << it << ' ';
}
fout << '\n';
}