Pagini recente » Cod sursa (job #2120172) | Cod sursa (job #2694972) | Cod sursa (job #1408113) | Cod sursa (job #26269) | Cod sursa (job #1968425)
#include <bits/stdc++.h>
#define Nmax 200005
using namespace std;
vector <int> L[Nmax],T[Nmax];
bool seen[Nmax],viz[Nmax],Bad;
int ans[Nmax],order[Nmax],l;
inline void non(int x)
{
if(x<=n) return x+n;
return x-n;
}
inline void dfs(int nod)
{
viz[nod]=1;
for(auto it : L[nod])
if(!viz[it]) dfs(it);
order[++l]=nod;
}
inline void dfs1(int nod)
{
if(Bad) return;
seen[nod]=1;
if(ans[nod]==1)
{
Bad=1; return;
}
ans[nod]=0; ans[non(nod)]=1;
for(auto it : T[nod])
if(!seen[it]) dfs1(it);
}
int main()
{
int x,y;
ifstream cin("2sat.in");
ofstream cout("2sat.out");
cin>>n>>m;
while(m--)
{
cin>>x>>y;
if(x<0) x=non(x);
if(y<0) y=non(y);
L[non(x)].pb(y);
L[non(y)].pb(x);
T[y].pb(non(x));
T[x].pb(non(y));
}
for(i=1;i<=2*n;++i)
if(!viz[i]) dfs(i);
for(i=1;i<=n;++i) ans[i]=-1;
for(i=l;i && !Bad;--i)
if(!seen[order[i]]) dfs1(order[i]);
if(Bad) cout<<"-1\n";
else
{
for(i=1;i<=n;++i) cout<<ans[i]<<" ";
cout<<"\n";
}
return 0;
}