Pagini recente » Cod sursa (job #2797704) | Cod sursa (job #1486047) | Cod sursa (job #2646126) | Cod sursa (job #1257220) | Cod sursa (job #2985035)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream cin("2sat.in");
ofstream cout("2sat.out");
const int NMAX = 2e5 + 1;
int m;
vector<int> vecini[NMAX],t[NMAX],topo;
bool viz[NMAX]; int care[NMAX],e;
void dfs(int nod)
{
viz[nod] = 1;
for(auto it : vecini[nod])
{
if(viz[it]) continue;
dfs(it);
}
topo.emplace_back(nod);
}
int getint()
{
int x; cin >> x; return x;
}
int falseval(int x)
{
if(x < 0) return -x + m;
return x;
}
int negativ(int x)
{
return x > m ? x - m : x + m;
}
void cauta(int nod)
{
care[nod] = e;
for(auto it : t[nod])
{
if(care[it]) continue;
cauta(it);
}
}
int main()
{
int n,x; cin >> m >> n;
for(int i = 1; i <= n ; i++)
{
int a,b; a = falseval(getint());
b = falseval(getint());
vecini[negativ(a)].emplace_back(b);
vecini[negativ(b)].emplace_back(a);
t[b].emplace_back(negativ(a));
t[a].emplace_back(negativ(b));
}
for(int i = 1; i <= 2 * m ; i++)
{
if(viz[i]) continue;
dfs(i);
}
for(auto it = topo.rbegin() ; it != topo.rend() ; it++)
{
if(care[*it]) continue;
e++; cauta(*it);
}
queue<string> ans;
for(int i = 1; i <= m ; i++)
{
if(care[i] == care[i + m]) break;
ans.push(care[i] > care[i + m] ? "1 " : "0 ");
}
if(ans.size() != m)
{
cout << -1;
return 0;
}
while(!ans.empty())
{
cout << ans.front(); ans.pop();
}
}