Pagini recente » Cod sursa (job #1141898) | Cod sursa (job #2163414) | Cod sursa (job #2480947) | Cod sursa (job #1820833) | Cod sursa (job #1760198)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define NMax 100000
using namespace std;
int n, m;
vector<int> v[2*NMax+5];
vector<int> v_m[2*NMax+5];
int comp[2*NMax+5];
vector<bool> comp_val;
bool viz[2*NMax+5];
vector<int> q;
bool sol[NMax+5];
#define v (v+NMax)
#define v_m (v_m+NMax)
#define comp (comp+NMax)
#define viz (viz+NMax)
void kosaraju_visit(int nod) {
if (nod == 0 || viz[nod])
return;
viz[nod] = true;
for (int i = 0; i < v[nod].size(); i++)
kosaraju_visit(v[nod][i]);
q.push_back (nod);
}
void kosaraju_assign(int nod, int component) {
if (nod == 0 || comp[nod] != 0)
return;
comp[nod] = component;
for (int i = 0; i < v_m[nod].size (); i++) {
kosaraju_assign(v_m[nod][i], component);
}
}
bool sat2() {
for (int i = -n; i <= n; i++)
kosaraju_visit(i);
comp_val.push_back (0);
for (int i = q.size () - 1; i >= 0; i--) {
int node = q[i];
if (comp[node] == 0) {
kosaraju_assign(node, comp_val.size ());
comp_val.push_back(0);
}
}
for (int i = 1; i <= n; i++) {
if (comp[i] == comp[-i])
return false;
else if (comp[i] < comp[-i])
comp_val[comp[-i]] = 1;
else
comp_val[comp[i]] = 1;
}
for (int i = 1; i <= n; i++)
sol[i] = comp_val[comp[i]];
return true;
}
void add (int x, int y) {
v[x].push_back (y);
v_m[y].push_back (x);
}
int main ()
{
ifstream fin ("2sat.in");
ofstream fout("2sat.out");
int x, y;
fin >> n >> m;
for (int i = 0; i < m; i++) {
fin >> x >> y;
add(-x, y);
add(-y, x);
}
if (sat2()) {
for (int i = 1; i <= n; i++)
fout << sol[i] << ' ';
fout << '\n';
}
else {
fout << -1 << '\n';
}
return 0;
}