Pagini recente » shimulare_fara_shim | Cod sursa (job #2431484) | Cod sursa (job #1147368) | Cod sursa (job #298832) | Cod sursa (job #1542765)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
int N,M,t;
int L[200005],C[200005],viz[200005],lista,sol[200005];
vector<int> a[200005],b[200005];
int complement(int x)
{
if(x>N) return x-N;
return x+N;
}
void dfs1(int nod)
{
viz[nod]=1;
int i;
for(i=0;i<a[nod].size();i++)
{
if(!viz[a[nod][i]])
{
dfs1(a[nod][i]);
}
}
L[lista--]=nod;
}
void dfs2(int nod,int t)
{
C[nod]=t;
int i;
for(i=0;i<b[nod].size();i++)
{
if(!C[b[nod][i]])
{
dfs2(b[nod][i],t);
}
}
}
int main()
{
f>>N>>M;
int i,x,y,c1,c2;
t=1;
lista=N*2;
for(i=1;i<=M;i++)
{
f>>x>>y;
if(x<0) x=x*(-1)+N;
if(y<0) y=y*(-1)+N;
c1=complement(x);
c2=complement(y);
a[c1].push_back(y);
a[c2].push_back(x);
b[y].push_back(c1);
b[x].push_back(c2);
}
for(i=1;i<=N*2;i++)
{
if(!viz[i])
{
dfs1(i);
}
}
t=1;
for(i=1;i<=N*2;i++)
{
if(!C[L[i]]) dfs2(L[i],t),t++;
}
for(i=1;i<=N;i++)
{
if(C[i]==C[i+N])
{
g<<-1;
return 0;
}
}
int cnt,j;
for(i=1;i<t;i++)
{ cnt=-1;
for(j=1;j<=2*N;j++)
{
if(C[j]==i&&sol[j]!=0) cnt=sol[j];
}
if(cnt!=-1)
{
for(j=1;j<=2*N;j++)
{ if(C[j]==i)
{ sol[j]=cnt;
if(cnt==1) c1=2;
else c2=1;
if(j<=N&&sol[j+N]==0) sol[j+N]=c1;
else if(sol[j-N]==0) sol[j-N]=c2;
}
}
}
else
{
for(j=1;j<=2*N;j++)
{ if(C[j]==i)
{sol[j]=1;
if(j<=N&&sol[j+N]==0) sol[j+N]=2;
else if(sol[j+N]==0) sol[j-N]=2;
}
}
}
}
for(i=1;i<=N;i++) g<<sol[i]-1<<" ";
return 0;
}