Pagini recente » Cod sursa (job #1989215) | Cod sursa (job #2268496) | Cod sursa (job #2346631) | Cod sursa (job #2821415) | Cod sursa (job #2218283)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
vector < int > g[2 * MAXN + 1], gt[2 * MAXN + 1], ord;
int seen[2 * MAXN + 1], val[2 * MAXN + 1];
int n, nope;
inline int non(int node) {
if (node <= n)
return node + n;
return node - n;
}
void norm_dfs(int node) {
seen[node] = 1;
for (auto it : g[node])
if (seen[it] == 0)
norm_dfs(it);
ord.push_back(node);
}
void rev_dfs(int node) {
if (val[node])
nope = 1;
val[non(node)] = 1;
seen[node] = 0;
for (auto it : gt[node])
if (seen[it])
rev_dfs(it);
}
int main()
{
int m;
ifstream fin("2sat.in");
fin >> n >> m;
for (int i = 0; i < m; ++i) {
int x, y;
fin >> x >> y;
if (x < 0)
x = -x + n;
if (y < 0)
y = -y + n;
g[non(x)].push_back(y);
g[non(y)].push_back(x);
gt[x].push_back(non(y));
gt[y].push_back(non(x));
}
fin.close();
for (int i = 1; i <= 2 * n; ++i)
if (seen[i] == 0)
norm_dfs(i);
while (ord.empty() == false) {
if (seen[ord.back()] && seen[non(ord.back())])
rev_dfs(ord.back());
ord.pop_back();
}
ofstream fout("2sat.out");
if (nope)
fout << "-1\n";
else {
for (int i = 1; i <= n; ++i)
fout << val[i] << " ";
fout << '\n';
}
fout.close();
return 0;
}