Pagini recente » Cod sursa (job #2112403) | Cod sursa (job #2065779) | Cod sursa (job #1630343) | Cod sursa (job #1206516) | Cod sursa (job #1542616)
#include <iostream>
#include <fstream>
#include<vector>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int n,m;
typedef vector<int> VEC[200001];
VEC a, b;
int v[200001];
bool solutie[200005];
struct
{
int x[200005];
int k;
}l;
void dfs(int i,int t,VEC &a)
{
//cout << "start " << i << endl;
int j;
if(t>1 && solutie[i]) solutie[0]=1;
else if(t>1) solutie[i+ (i>n ? -n:n)]=1;
v[i]=t;
for(j=0;j<a[i].size();j++)
if(!v[a[i][j]])
dfs(a[i][j],t,a);
if(t==1)
l.x[l.k++]=i;
//cout << "end " << i << endl;
}
void draw_arc(int x,int y,VEC &a,int aux)
{
if(aux==2) swap(x,y);
if(x>n) x-=n; else x+=n;
if(aux==2) swap(x,y);
a[x].push_back(y);
}
int main()
{
fin>>n>>m;
int j,i;
while(m--)
{
fin>>i>>j;
if(i<0) i=n-i;
if(j<0) j=n-j;
draw_arc(i,j,a,1);
draw_arc(j,i,a,1);
draw_arc(i,j,b,2);
draw_arc(j,i,b,2);
}
for(j=1;j<=n*2;j++)
if(!v[j])
dfs(j,1,a);
for(i=0;i<=n*2;i++)v[i]=0;
int t=2;
for(j=l.k-1;j>=0;j--)
if(!v[l.x[j]] && !v[l.x[j]+ (l.x[j]>n ? -n:n)])
{
dfs(l.x[j],t,b);
t++;
}
for(i=1;i<=n*2;i++)
if((i>=n+1 && v[i]==v[i-n]) || (i<=n && v[i+n]==v[i]))
{
fout<<-1;
return 0;
}
for(int i=1;i<=n;++i) fout<<solutie[i]<<' ';
return 0;
}