Cod sursa(job #1157256)

Utilizator irimiecIrimie Catalin irimiec Data 28 martie 2014 12:53:40
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <stack>
#include <list>

#define FR( C, it ) \
	for( typeof(C.begin()) it = C.begin(); it != C.end(); it++)

using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

int n, m, a, b, deg[ 100010 ], viz[ 100010 ];
list<int> v[ 100010 ], L;
queue<int> Q;
stack<int> S;

void read()
{
	f >> n >> m;
	for(int i = 0; i < m; ++i)
	{
		f >> a >> b;
		v[ a ].push_back(b); deg[ a ]++;
		v[ b ].push_back(a); deg[ b ]++;
	}
}

void BFS()
{
	int aux;
	Q.push(1); viz[1] = 1;
	while(!Q.empty())
	{
		aux = Q.front(); Q.pop();
		FR( v[aux], it )
			if(viz[ *it ] == 0)
				Q.push(*it), viz[ *it ] = 1;
	}
}

bool euler()
{
	BFS();
	for(int i = 2; i <= n; ++i)
		if(viz[ i ] == 0)
			return false;
	
	for(int i = 1; i <= n; ++i)
		if(deg[ i ] % 2 == 1)
			return false;
			
	return true;
}

void sterge(int a, int b)
{
	deg[ a ]--; deg[ b ]--;
	v[a].pop_front();
	FR( v[b], it )
		if(*it == a)
		{
			v[b].erase(it);
			break;
		}
}

void ciclu()
{
	int aux = 1;
	do
	{
		while(true)
		{
			if(v[aux].empty())
				break;
			int aux2 = v[aux].front();
			S.push(aux);
			sterge(aux, aux2);
			aux = aux2;
		}
		aux = S.top(); S.pop();
		L.push_back(aux);
	} while( !S.empty() );
	
	FR( L, it )
			g << *it << " ";
}

int main()
{
	read();
	if(euler())
		ciclu();
	else
		g << "-1\n";
}