Cod sursa(job #486413)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 21 septembrie 2010 16:53:13
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
// infoarena: problema/ciclueuler //

#include <fstream>
#include <vector>

#define MAXN 100010
#define MAXM 500010
using namespace std;

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

vector<int> g[MAXN];
int i,j,n,m,a,b;

struct stack_item {int nod, next;};
stack_item empty, c;
vector<stack_item> stack;
vector<int> sol;

int main()
{
	in>>n>>m;
	for(i=1; i<=m; i++)
	{
		in>>a>>b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	
	for(i=1; i<=n; i++)
		if(g[i].size() % 2)
			{out<<-1; return 0;}
	
	stack.push_back(empty);
	stack.back().nod = 1;
	
	while(!stack.empty())
	{
		c = stack.back();
		
		while(!g[c.nod].empty() && g[c.nod].back() == -1)
			g[c.nod].pop_back();
		
		if(!g[c.nod].empty())
		{
			c.next = g[c.nod].back();
			g[c.nod].pop_back();
			for(i=0; i<g[c.next].size(); ++ i)
				if(g[c.next][i] == c.nod)
					{g[c.next][i] = -1; break;}
			stack.push_back(empty);
			stack.back().nod = c.next;
		}
		else
		{
			sol.push_back(c.nod);
			stack.pop_back();
		}
	}
	
	if(sol.size() != m+1)
	{
		out<<-1;
		return 0;
	}
	
	for(i=0; i<sol.size() - 1; i ++)
	{
		out<<sol[i]<<' ';
	}
	
	return 0;
}