Pagini recente » Cod sursa (job #694730) | Cod sursa (job #2095506) | Cod sursa (job #819503) | Cod sursa (job #2557433) | Cod sursa (job #3041563)
#include<fstream>
#include<vector>
using namespace std;
ifstream cin("2sat.in");
ofstream cout("2sat.out");
class SAT
{
private: vector<vector<int>> vecini,vecinit; int n,e; vector<bool> viz; vector<int> top,what;
int id(int l)
{
if(l < 0) return abs(l) + n;
else return l;
}
int nega(int l)
{
if(l < 0) return abs(l);
else return l + n;
}
void dfs(int nod)
{
viz[nod] = 1;
for(auto it : vecini[nod])
{
if(!viz[it])
dfs(it);
}
top.emplace_back(nod);
}
void trans(int nod)
{
what[nod] = e;
for(auto it : vecinit[nod])
if(!what[it])
trans(it);
}
public: SAT(int _n)
{
n = _n; vecini.resize(2 * n + 1); what.resize(2 * n + 1,0);
vecinit.resize(2 * n + 1); viz.resize(2 * n + 1,0);
}
void add_or(int a,int b)
{
vecini[nega(a)].emplace_back(id(b));
vecini[nega(b)].emplace_back(id(a));
vecinit[id(b)].emplace_back(nega(a));
vecinit[id(a)].emplace_back(nega(b));
}
vector<int> getans()
{
for(int i = 1; i <= 2 * n ; i++)
if(!viz[i]) dfs(i);
vector<int> r(n + 1);
for(auto it = top.rbegin(); it != top.rend() ; it++)
{
if(!what[*it]) e++,trans(*it);
}
for(int i = 1; i <= n ; i++)
{
if(what[i] == what[i + n])
{
r = {-1};
return r;
}
if(what[i] > what[i + n]) r[i] = 1;
else r[i] = 0;
}
if(r.size() > 1) r.erase(r.begin());
return r;
}
};
int main()
{
int n,m,a,b; cin >> n >> m;
SAT g(n); while(m--)
{
cin >> a >> b;
g.add_or(a,b);
}
vector<int> ans = g.getans();
for(auto it : ans) cout << it << " ";
}