Pagini recente » Cod sursa (job #933274) | Cod sursa (job #1906301) | Cod sursa (job #915971) | Cod sursa (job #1857674) | Cod sursa (job #1909584)
#include <fstream>
#include <vector>
using namespace std;
vector <int> adia[200010], adia_back[200010];
vector <int> sortop;
bool viz[200010], mere(1);
int n;
int ans[200010];
int inv(int nod);
void dfs(int nod);
void dfs_back(int nod);
int main()
{
ifstream in("2sat.in");
ofstream out("2sat.out");
int m, a, b;
in >> n >> m;
while (m--) {
in >> a >> b;
if (a < 0)
a = n - a;
if (b < 0)
b = n - b;
adia[inv(a)].push_back(b);
adia[inv(b)].push_back(a);
adia_back[a].push_back(inv(b));
adia_back[b].push_back(inv(a));
}
for (int i(1); i <= 2 * n; i++)
if (!viz[i])
dfs(i);
for (reverse_iterator <vector <int> :: iterator> it(sortop.rbegin()); it != sortop.rend(); it++)
if (viz[*it] && viz[inv(*it)])
dfs_back(*it);
if (!mere) {
out << -1;
return 0;
}
for (int i(1); i <= n; i++)
out << ans[i] << ' ';
return 0;
}
void dfs_back(int nod)
{
if (ans[nod] == 1)
mere = 0;
viz[nod] = 0;
ans[nod] = 0;
ans[inv(nod)] = 1;
for (auto i : adia_back[nod]) {
if (viz[i])
dfs_back(i);
}
}
void dfs(int nod)
{
viz[nod] = 1;
for (auto i : adia[nod]) {
if (!viz[i])
dfs(i);
}
sortop.push_back(nod);
}
int inv(int nod)
{
if (nod <= n)
return n + nod;
return nod - n;
}