Pagini recente » Cod sursa (job #793741) | Cod sursa (job #3266185) | Cod sursa (job #1316352) | Cod sursa (job #1792517) | Cod sursa (job #2739463)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
typedef pair<int,int> pii;
int n,m;
vector<pii> G;
vector<int> muchii[200005],st,c[300005];
int sol[300005],nr,comp[300005];
bool use[300006];
void dfs1(int nod)
{
use[nod]=1;
for(auto i:muchii[nod])
if(!use[i])
dfs1(i);
st.push_back(nod);
}
void dfs(int nod)
{
use[nod]=1;
comp[nod]=nr;
c[nr].push_back(nod);
for(auto i:muchii[nod])
if(!use[i])
dfs(i);
}
int main()
{
ios_base::sync_with_stdio(false);
fin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
muchii[-x+n].push_back(y+n);
muchii[-y+n].push_back(x+n);
G.push_back({-x+n,y+n});
G.push_back({-y+n,x+n});
}
for(int i=1;i<=n;i++)
{
if(!use[i+n])
dfs1(i+n);
if(!use[-i+n])
dfs1(-i+n);
}
reverse(st.begin(),st.end());
for(int i=1;i<=n;i++)
{
use[i+n]=0;
use[-i+n]=0;
muchii[i+n].clear();
muchii[-i+n].clear();
}
for(auto i:G)
muchii[i.second].push_back(i.first);
for(auto i:st)
if(!use[i])
{
nr++;
dfs(i);
}
for(int i=1;i<=n;i++)
if(comp[-i+n]==comp[i+n])
{
fout<<-1;
return 0;
}
memset(use,0,sizeof(use));
for(int i=1;i<=nr;i++)
for(auto j:c[i])
{
int nod=j-n;
if(use[abs(nod)]==0)
{
use[abs(nod)]=1;
if(nod>0)
sol[nod]=0;
else
sol[-nod]=1;
}
}
for(int i=1;i<=n;i++)
fout<<sol[i]<<" ";
return 0;
}