Pagini recente » Profil elisei | Cod sursa (job #1134786) | Cod sursa (job #1241680) | Istoria paginii utilizator/teapa | Cod sursa (job #1854718)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 200004;
vector <int> v[NMAX], st, vt[NMAX];
int sol[NMAX], viz[NMAX], viz2[NMAX], n, m, x, y, ok;
int non(int x)
{
if (x <= n)
return x + n;
return x - n;
}
void dfs(int k)
{
viz[k] = 1;
for (int i = 0; i < v[k].size(); i ++)
if (viz[v[k][i]] == 0)
dfs(v[k][i]);
st.push_back(k);
}
void dfs2(int k)
{
// cout <<"k = " << k <<" " << non(k) << "\n";
if (sol[k] == 1)
ok = 1;
sol[non(k)] = 1;
viz[k] = 0;
for (int i = 0; i < vt[k].size(); i++)
if (viz[vt[k][i]] == 1)
dfs2(vt[k][i]);
}
int main ()
{
ifstream cin ("2sat.in");
ofstream cout ("2sat.out");
cin >> n >> m;
//cout << n << " " << m << "\n";
for (int i = 1; i <= m; i++)
{
cin >> x >> y;
if (x < 0)
x = non(-x);
if (y < 0)
y = non(-y);
// cout << x << " " << y << " " << non(x) << " " << non(y) << "\n";
v[non(x)].push_back(y);
v[non(y)].push_back(x);
vt[x].push_back(non(y));
vt[y].push_back(non(x));
}
for (int i = 1; i <= n * 2; i++)
{
//cout << viz[i] << " ";
if (viz[i] == 0)
dfs(i);
}
/* cout << st.size() << "\n";
for (int i = st.size() - 1; i >= 0; i--)
cout << st[i] << " ";
cout << "\n";*/
for (int i = st.size() - 1; i >= 0; i--)
if(viz[st[i]] && viz[non(st[i])])
dfs2(st[i]);
if (ok == 1)
{
cout << "-1";
return 0;
}
for (int i = 1; i <= n; i++)
cout << sol[i] << " ";
return 0;
}