Cod sursa(job #280442)

Utilizator cotofanaCotofana Cristian cotofana Data 13 martie 2009 13:15:50
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#include <list>
#include <stack>
#include <queue>

using namespace std;

#define TR(C, it) for (typeof(C.begin())it=C.begin(); it!=C.end(); it++)
#define pb push_back
#define dim 100100

list<int> g[dim], l;
stack<int> s;
queue<int> q;

int n, m, gr[dim], fol[dim];

void bfs(int v)
{
	q.push(v);
	fol[v]=1;
	while (!q.empty())
	{
		v=q.front();
		q.pop();
		TR(g[v], w)
			if (!fol[*w])
			{
				q.push(*w);
				fol[*w]=1;
			}
	}
}

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

void sterge(int v, int w)
{
	gr[v]--, gr[w]--;
	g[v].pop_front();
	TR(g[w], it)
		if (*it==v)
		{
			g[w].erase(it);
			break;
		}
}

void euler(int v)
{
	while (1)
	{
		if (g[v].empty()) break;
		int w=g[v].front();
		s.push(v);
		sterge(v, w);
		v=w;
	}
}

void construire()
{
	int v=1;
	do
	{
		euler(v);
		v=s.top();
		s.pop();
		l.pb(v);
	} while (!s.empty());
}

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

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);
		gr[a]++, gr[b]++;
		g[a].pb(b);
		g[b].pb(a);
	}
	if (eulerian()) TR(l, v) printf("%d ", *v);
	else printf("-1\n");
	return 0;
}