Pagini recente » Cod sursa (job #375072) | Cod sursa (job #2124364) | Cod sursa (job #927633) | Cod sursa (job #2915731) | Cod sursa (job #2313951)
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define M 200001
int v,e,x,y,i,c,j,o;
vector<int> a[M],b[M],vtc(M),value(M,-1),d(M,0);
vector<vector<int>> sccs;
queue<int> q;
int A(int x)
{
return x<0?-x:x;
}
int I(int x)
{
return x<0?A(x)+v:x;
}
int N(int x)
{
return x>v?x-v:x+v;
}
void D(int n,vector<int>& used,vector<int>& discover)
{
vector<int>::iterator it;
used[n]=1;
for(it=a[n].begin();it!=a[n].end();++it)
if(!used[*it])
D(*it,used,discover);
discover.push_back(n);
}
void E(int n,vector<int>& used,vector<int>& scc)
{
vector<int>::iterator it;
used[n]=1;
scc.push_back(n);
for(it=b[n].begin();it!=b[n].end();++it)
if (!used[*it])
E(*it,used,scc);
}
void C()
{
vector<int> used(M),discover,scc;
used.assign(used.size(),0);
for(int i=1;i<=v*2;++i)
if(!used[i])
D(i,used,discover);
used.assign(used.size(),0);
vector<int>::reverse_iterator it;
for(it=discover.rbegin();it!=discover.rend();++it)
if (!used[*it])
{
scc.clear();
E(*it,used,scc);
for(vector<int>::iterator it2=scc.begin();it2!=scc.end();++it2)
vtc[*it2]=sccs.size();
sccs.push_back(scc);
}
}
int main()
{
ifstream f("2sat.in");
ofstream g("2sat.out");
f>>v>>e;
for(i=0;i<e;++i)
{
f>>x>>y;
a[N(I(x))].push_back(I(y));
b[I(y)].push_back(N(I(x)));
a[N(I(y))].push_back(I(x));
b[I(x)].push_back(N(I(y)));
}
C(),c=0;
for(x=1;x<=v;++x)
if(vtc[x]==vtc[x+v])
c=1;
if(!c)
{
for(x=1;x<=v*2;++x)
for(vector<int>::iterator it=a[x].begin();it!=a[x].end();++it)
if(vtc[x]!=vtc[*it])
d[vtc[*it]]++;
for(o=(int)sccs.size(),j=0;j<o;++j)
if(!d[j])
q.push(j);
while(!q.empty())
{
j=q.front(),q.pop();
vector<int>::iterator it,k,l;
for(it=sccs[j].begin();it!=sccs[j].end();++it)
{
x=(*it>v)?*it-v:*it;
if(value[x]==-1)
value[x]=(*it<=v)?0:1;
}
for(k=sccs[j].begin();k!=sccs[j].end();++k)
for(l=a[*k].begin();l!=a[*k].end();++l)
if (vtc[*k]!=vtc[*l])
if((--d[vtc[*l]])==0)
q.push(vtc[*l]);
}
for(i=1;i<=v;++i)
g<<value[i]<<" ";
}
else
g<<-1;
}