Cod sursa(job #280312)

Utilizator cotofanaCotofana Cristian cotofana Data 13 martie 2009 12:22:15
Problema Ciclu Eulerian Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include <stdio.h>
#define dim 100100

struct nod
{
	long nr;
	nod *urm;
};
int gr[dim], fol[dim], ce[dim*5];
long long n, k, m;
nod *p[dim];

void add(nod *&p, long nr)
{
	nod *n1=new nod;
	n1->nr=nr;
	n1->urm=p;
	p=n1;
}

int gr_par()
{
	long long i;
	for (i=1; i<=n; i++)
		if (gr[i]%2!=0 || gr[i]==0) return 0;
	return 1;
}

void dfs(int x)
{
	nod *cur;
	int st[dim];
	long long in;
	st[1]=x;
	in=1;
	fol[st[in]]=1;
	while (in)
	{
		cur=p[st[in]];
		in--;
		while (cur)
		{
			if (cur->nr!=x && !fol[cur->nr])
			{
				st[++in]=cur->nr;
				fol[cur->nr]=1;
			}
			cur=cur->urm;
		}
	}
}

int conex()
{
	long long i;
	dfs(1);
	for (i=2; i<=n; i++)
		if (!fol[i]) return 0;
	return 1;
}

void stergere(nod *&p, long nr)
{
	nod *q, *q1;
	q=p;
	while (q)
	{
		if (q->nr==nr) break;
		q1=q;
		q=q->urm;
	}
	if (q==p)
	{
		p=p->urm;
		delete q;
	}
	else
	{
		q1->urm=q->urm;
		delete q;
	}
}

void construire()
{
	int ce1[dim*5];
	long long v=-1, cur, k1, i;
	k=1;
	ce[1]=1;
	do
	{
		cur=p[ce[k]]->nr;

		stergere(p[ce[k]], cur);
		stergere(p[cur], ce[k]);

		gr[ce[k]]--;
		gr[cur]--;

		k++;
		ce[k]=cur;
	} while (ce[k]!=ce[1]);
	while (k<m+1)
	{
		for (i=1; i<=k; i++)
			if (gr[i])
			{
				v=i;
				k1=1;
				ce1[1]=ce[i];
				break;
			}
		if (v>0)
		{
			do
			{
				cur=p[ce1[k1]]->nr;

				stergere(p[ce1[k1]], cur);
				stergere(p[cur], ce1[k1]);

				gr[ce1[k1]]--;
				gr[cur]--;

				k1++;
				ce1[k1]=cur;
			} while (ce1[k1]!=ce1[1]);
			for (i=k; i>v; i--)
				ce[i+k1-1]=ce[i];
			for (i=1; i<=k1; i++)
				ce[v+i-1]=ce1[i];
			k+=k1-1;
		}
	}
}

int eulerian()
{
	if (!gr_par()) return 0;
	if (!conex()) return 0;
	construire();
	return 1;
}

void del()
{
	long long i;
	nod *n1;
	for (i=1; i<=n; i++)
	{
		while (p[i])
		{
			n1=p[i];
			p[i]=p[i]->urm;
			delete n1;
		}
	}
}

int main()
{
	long long a, b, i;
	freopen("ciclueuler.in", "r", stdin);
	freopen("ciclueuler.out", "w", stdout);
	scanf("%lld %lld\n", &n, &m);
	for (i=1; i<=m; i++)
	{
		scanf("%lld %lld\n", &a, &b);
		add(p[a], b);
		add(p[b], a);
		gr[a]++, gr[b]++;
	}
	if(eulerian())
		for (i=1; i<k; i++) printf("%d ", ce[i]);
	else printf("-1\n");
	del();
	return 0;
}