Pagini recente » Cod sursa (job #2262947) | Cod sursa (job #2989856) | Cod sursa (job #3181387) | Cod sursa (job #2849456) | Cod sursa (job #2869133)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("2sat.in");
ofstream fout ("2sat.out");
vector<int> v[200002];
vector<int> vt[200002];
vector<int> s;
vector<bool> viz;
int n, m, a, b, nr;
int comp[200002];
bool val[100001];
void dfs1(int start) {
viz[start] = 1;
for (int i=0; i<v[start].size(); i++) {
if (!viz[v[start][i]]) {
dfs1(v[start][i]);
}
}
s.push_back(start);
}
void dfs2(int start, int nr) {
viz[start] = 1;
for (int i=0; i<vt[start].size(); i++) {
if (!viz[vt[start][i]]) {
dfs2(vt[start][i], nr);
}
}
comp[start] = nr;
}
int main()
{
fin>>n>>m;
for (int i=1; i<=m; i++) {
fin>>a>>b;
/// -a -> b
/// -b -> a
if (a > 0 and b > 0) {
v[n+a].push_back(b);
v[n+b].push_back(a);
vt[b].push_back(n+a);
vt[a].push_back(n+b);
}
else if (a < 0 and b > 0) {
v[-a].push_back(b);
v[n+b].push_back(n-a);
vt[b].push_back(-a);
vt[n-a].push_back(n+b);
}
else if (a > 0 and b < 0) {
v[n+a].push_back(n-b);
v[-b].push_back(a);
vt[n-b].push_back(n+a);
vt[a].push_back(-b);
}
else if (a < 0 and b < 0) {
v[-a].push_back(n-b);
v[-b].push_back(n-a);
vt[n-b].push_back(-a);
vt[n-a].push_back(-b);
}
}
viz = vector<bool>((2*n)+2, 0);
for (int i=1; i<=2*n; i++) {
if (!viz[i]) {
dfs1(i);
}
}
viz = vector<bool>((2*n)+2, 0);
for (int i=s.size()-1; i>=0; i--) {
if (!viz[s[i]]) {
nr++;
dfs2(s[i], nr);
}
}
// fout<<"nr = "<<nr<<"\n";
//
// for (int i=1; i<=nr; i++) {
// fout<<"componenta "<<i<<": ";
// for (int j=1; j<=2*n; j++) {
//
// if (comp[j] == i) {
// if (j <= n) {
//
// fout<<j<<" ";
// }
// else {
//
// fout<<n-j<<" ";
// }
// }
//
// }
// fout<<"\n";
// }
for (int i=1; i<=n; i++) {
if (comp[i] == comp[n+i]) {
fout<<"-1\n";
return 0;
}
val[i] = comp[i] > comp[n+i];
fout<<val[i]<<" ";
}
return 0;
}