Cod sursa(job #280404)

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

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

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

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

void bfs(int x)
{
	nod *cur;
	int q[dim], st, dr;
	q[1]=x;
	st=dr=1;
	fol[q[st]]=1;
	while (st<=dr)
	{
		cur=p[q[st]];
		while (cur)
		{
			if (!fol[cur->nr])
			{
				q[++dr]=cur->nr;
                                fol[cur->nr]=1;
			}
			cur=cur->urm;
		}
		st++;
	}
}

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

void stergere(nod *&p, int 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 v=-1, ce1[dim*5], 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 (!conex()) return 0;
	if (!gr_par()) return 0;
	construire();
	return 1;
}

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

int main()
{
	int a, b, i;
	freopen("ciclueuler.in", "r", stdin);
	freopen("ciclueuler.out", "w", stdout);
	scanf("%d %d\n", &n, &m);
	for (i=1; i<=m; i++)
	{
		scanf("%d %d\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;
}