Pagini recente » Cod sursa (job #500548) | Cod sursa (job #1157929) | Cod sursa (job #2856067) | Cod sursa (job #2698624) | Cod sursa (job #1542880)
#include <stdio.h>
#include <vector>
#include <stack>
using namespace std;
struct nod
{
int val;
};
stack< int > s;
vector < int > lista2[200010],lista[200010];
int n,m,nrc,marcat[200010],viz[200010];
int negat(int a)
{
if(a > n) return n*2 - a + 1;
return 2*n - a + 1;
}
void dfs(int n)
{
unsigned int i;
viz[n] = 1;
for(i = 0; i < lista[n].size(); i++)
if(viz[lista[n][i]] == 0) dfs(lista[n][i]);
s.push(n);
}
void dfs2(int n)
{
unsigned int i;
viz[n] = 0;
for(i=0; i < lista2[n].size(); i++)
if(viz[lista2[n][i]] == 1) dfs2(lista2[n][i]);
marcat[n]=nrc;
}
int opus(int nr)
{
if(nr >= n) return nr - n;
return nr + n + 1;
}
int main()
{
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%d %d",&n,&m);
int i,a,b;
for(i=0; i<m; i++)
{
scanf("%d %d",&a,&b);
if (a < 0) a = a + n + 1;
else if(a > 0) a = a + n;
if (b < 0) b = b + n + 1;
else if(b > 0) b = b + n;
lista[negat(a)].push_back(b);
lista[negat(b)].push_back(a);
lista2[b].push_back(negat(a));
lista2[a].push_back(negat(b));
}
for (i=1; i<=n*2; i++)
if(!viz[i]) dfs(i);
nrc=0;
int x;
while(!s.empty())
{
x = s.top();
if (viz[x])
{
nrc++;
dfs2(x);
}
s.pop();
}
for (i=1; i<=n; i++)
{
if(marcat[i]==marcat[ negat(i) ])
{
printf("-1\n");
return 0;
}
}
for(i=n+1; i<=2*n; i++)
{
if(marcat[i] < marcat[negat(i)] ) printf("0 ");
else printf("1 ");
}
printf("\n");
return 0;
}