Pagini recente » Cod sursa (job #711102) | Cod sursa (job #812459) | Cod sursa (job #2180273) | Cod sursa (job #104737) | Cod sursa (job #3171712)
#include <fstream>
#include <vector>
constexpr unsigned NM = 100010;
std::vector<int> v[NM<<1];
int n,m,val[NM<<1],E1[NM<<1],E2[NM<<1],viz[NM<<1],top[NM<<1];
#define viz (viz+NM)
#define val (val+NM)
#define v (v+NM)
void dfs(int nod)
{
viz[nod] = true;
for (auto i : v[nod]) {
if (!viz[i]) {
dfs(i);
}
}
top[++top[0]] = nod;
}
int main () {
std::ifstream f("2sat.in");
std::ofstream t("2sat.out");
f >> n >> m;
for (int x, y, i = 1; i <= m; ++i) {
f >> x >> y;
E1[i]=x;
E2[i]=y;
v[x].push_back(-y);
v[y].push_back(-x);
}
for (int i = 1; i <= n; ++i) {
if(!viz[i]) {
dfs(i);
}
}
for (int i = 1; i <= (n << 1); ++i) {
if(!val[top[i]] and !val[-top[i]]) {
val[-top[i]] = 1;
}
}
for (int x, y, i = 1; i <= m; ++i) {
x = E1[i];
y = E2[i];
if((val[-x] and !val[y]) or (val[-y] and !val[x])) {
t << "-1";
return 0;
}
}
for (int i = 1; i <= n; ++i) {
t << val[i] << " ";
}
return 0;
}