Cod sursa(job #1735575)

Utilizator dodecagondode cagon dodecagon Data 30 iulie 2016 11:14:21
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <stdio.h>
#include <stdlib.h>


struct list
{
	int x;
	list * next;
};

char u[200009],f[200009];
int s[200009],n,m,x,y,k,i;
list * g[200009],* gt[200009];

int neg(int x)
{
	if (x<=n) 
		return n+x;
	return x-n;
}

void add(int x,int y)
{
	if (x<0) x=n-x;
	if (y<0) y=n-y;

    list * p= (list *) malloc(sizeof(list));
    p->x=x;
    p->next=g[neg(y)];
    g[neg(y)]=p;
    p= (list *) malloc(sizeof(list));
    p->x=y;
    p->next=g[neg(x)];
    g[neg(x)]=p;

    p= (list *) malloc(sizeof(list));
    p->x=neg(y);
    p->next=gt[x];
    gt[x]=p;

    p= (list *) malloc(sizeof(list));
    p->x=neg(x);
    p->next=gt[y];
    gt[y]=p;

}

void dfs(int v)
{
	u[v]=1;
	for (list * p = g[v]; p ;p=p->next)
		if (!u[p->x]) dfs(p->x);
	s[k++]=v;
}

void tdfs(int v)
{
	u[v]=0;
	f[neg(v)]=1;

	for (list * p = gt[v]; p ;p=p->next)
		if (u[p->x]) tdfs(p->x);

}

int main()
{
   
   FILE * kfgd = freopen("2sat.in","r",stdin);
          kfgd = freopen("2sat.out","w",stdout);

	scanf("%d%d",&n,&m);

	while (m--)
	{
		scanf("%d%d",&x,&y);
		add(x,y);
	}

	for (i=1;i<=2*n;++i)
		if (!u[i]) dfs(i);

	for (i=2*n;i>0;--i)
		if (u[s[i]] && u[neg(s[i])])
            tdfs(s[i]);

     for (i=1;i<=2*n;++i)
     	if (f[i]==f[neg(i)])
     	{
     		puts("-1");
     		return 0;
     	}
   for (i=1;i<=n;++i)
   	 printf("%d ",f[i]);
	return 0;
}