Cod sursa(job #497272)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 1 noiembrie 2010 22:26:31
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>

const int maxn=100001, maxm=500001;
struct nod {
	int inf;
	nod *next;
} *A[maxn],*Sol;
int i,N,M,NR,Gr[maxn],st[maxm];

void add_v(int x, int y)
{
	nod *q=new nod;
	q->inf=y;
	q->next=A[x];
	A[x]=q;
	Gr[x]++;
}

void sterge_muchie(int x, int y)
{
	nod *q;
	if(A[x]->inf==y) A[x]=A[x]->next;
	else
	{		
		for(q=A[x];q->next->inf!=y;q=q->next);
		q->next=q->next->next;
	}
	if(A[y]->inf==x) A[y]=A[y]->next;
	else
	{
		for(q=A[y];q->next->inf!=x;q=q->next);
		q->next=q->next->next;	
	}
}

void add_s(int p)
{
	NR++;
	nod *s=new nod;
	s->inf=p;
	s->next=Sol;
	Sol=s;
}

void ciclu()
{
	int x,v;
	v=1; st[v]=1;
	while(v)
	{
		x=st[v];
		if(A[x])
		{
			st[++v]=A[x]->inf; //introducem un vecin aleator
			sterge_muchie(x,st[v]); //stergem muchia respectiva
		}
		else		
			add_s(st[v--]); //cand nu mai are vecini, il introducem ca sol
	}
}

void afisare()
{
	for(;Sol->next;Sol=Sol->next)
		printf("%d ",Sol->inf);
}

int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	scanf("%d %d",&N,&M);
	for(i=1;i<=M;i++) //citire
	{
		int x,y;
		scanf("%d %d",&x,&y);
		add_v(x,y);
		add_v(y,x);
	}
	for(i=1;i<=N;i++) //verificarea existentei unui ciclu conform teoremei
		if(Gr[i]%2!=0)
		{
			printf("-1");
			return 0;
		}	
	ciclu();
	if(NR-1==M) afisare();
	else printf("-1");
}