Cod sursa(job #477141)

Utilizator S7012MYPetru Trimbitas S7012MY Data 13 august 2010 16:07:22
Problema Andrei Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#define null NULL
#define DN 200005

int nr,n,m,ord[DN],sol[DN];
bool ok=true,viz[DN];

struct nod {
	int x;
	nod *urm;
} *g[DN],*gt[DN];

inline int non(int x) { return (x>n)?x-n:x+n; }

void adaugare(int x, int y, bool z) {
	nod *p;
	p=new nod;
	p->x=y;
	if(z) p->urm=g[x],g[x]=p;
	else p->urm=gt[x],gt[x]=p;
}

void dfs(int sursa) {
	if(viz[sursa]) return;
	viz[sursa]=true;
	nod *p;
	for(p=g[sursa]; p!=null; p=p->urm) if(!viz[p->x]) dfs(p->x);
	ord[++nr]=sursa;
}

void dfs_2(int sursa) {
	if(!viz[sursa]) return;
	viz[sursa]=false;
	nod *p;
	if(sol[sursa]) ok=false;
	sol[non(sursa)] =1;
	for(p=gt[sursa]; p!=null; p=p->urm) if(!viz[p->x]) dfs_2(p->x);
}

void add(int a,int b) {
	adaugare(a,non(b),false);
	adaugare(b,non(a),false);
	adaugare(non(a),b,true);
	adaugare(non(b),a,true);
}

int main()
{
	int i,x,y,z;
	freopen("andrei.in","r",stdin);
	freopen("andrei.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(i=1; i<=m; ++i) {
		scanf("%d %d %d",&x,&y,&z);
		if(z==0) add(x,y);
		else if(z==1) add(non(x),non(y));
		else add(x,non(y)),add(non(x),y);
	}
	for(i=1; i<=n+n; ++i) if(!viz[i]) dfs(i);
	for(i=n+n; i; --i) if(viz[ord[i]] && viz[non(ord[i])]) dfs_2(ord[i]);
	if(!ok) printf("-1");
	else for(i=1; i<=n; ++i) printf("%d ",sol[i]);
	return 0;
}