Pagini recente » Cod sursa (job #2849571) | Cod sursa (job #415369) | Cod sursa (job #1765841) | Cod sursa (job #3170804) | Cod sursa (job #2798784)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
const long long K=2e5+1;
vector<long long>v[K],vt[K];
long long viz[K],Viz[K],j,val[K];
long long sum[K];
bool as[K];
long long nrp[K],poz[K];
stack<long long>st;
vector<vector<long long>>ctc;
long long nrctc[K];
vector<long long>dag[K],dagt[K];
vector<long long>cc;
vector<long long>x,y;
vector<long long>nx,ny;
void dfs(long long nod)
{
viz[nod]=true;
for(auto q:v[nod])
{
if(!viz[q])
dfs(q);
}
st.push(nod);
}
void Dfs(long long nod)
{
Viz[nod]=true;
for(auto q:vt[nod])
{
if(!Viz[q])
Dfs(q);
}
cc.push_back(nod);
}
int main()
{
long long n,m,i,a,b;
fin>>n>>m;
for(long long i=1;i<=m;i++)
{
fin>>a>>b;
if(a<0)
{
a=-a;
a+=n;
a--;
}
else a--;
if(b<0)
{
b=-b;
b+=n;
b--;
}
else b--;
//fout<<a<<" "<<b<<endl;
//fout<<(b+n)%(2*n)<<" "<<(a+n)%(2*n)<<endl;
v[(a+n)%(2*n)].push_back(b);
v[(b+n)%(2*n)].push_back(a);
vt[b].push_back((a+n)%(2*n));
vt[a].push_back((b+n)%(2*n));
}
for(long long i=0;i<2*n;i++)
if(!viz[i])
dfs(i);
while(!st.empty())
{
j=st.top();
st.pop();
if(!Viz[j])
{
cc.clear();
Dfs(j);
ctc.push_back(cc);
}
}
for(long long i=0;i<ctc.size();i++)
for(auto q2:ctc[i])
nrctc[q2]=i+1;
for(long long i=0;i<2*n;i++)
for(auto q:v[i])
if(nrctc[i]!=nrctc[q])
{
dag[nrctc[i]].push_back(nrctc[q]);
dagt[nrctc[q]].push_back(nrctc[i]);
nrp[nrctc[q]]++;
}
vector<int>v;
queue<int>q;
for(int i=1;i<=ctc.size();i++)
if(dagt[i].size()==0)
{
q.push(i);
}
while(!q.empty())
{
int nod=q.front();
q.pop();
v.push_back(nod);
poz[nod]=v.size()-1;
for(auto qq:dag[nod])
{
nrp[qq]--;
if(nrp[qq]==0)
q.push(qq);
}
}
for(int i=0;i<n;i++)
if(nrctc[i]==nrctc[i+n])
{
fout<<-1;
return 0;
}
for(int i=0;i<n;i++)
{
if(poz[nrctc[i]]<poz[nrctc[i+n]])
fout<<0<<" ";
else fout<<1<<" ";
}
}