Cod sursa(job #758238)

Utilizator roxyroxy2011Luca Roxana roxyroxy2011 Data 14 iunie 2012 22:43:35
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
#include <stdlib.h>
#define NRMAX 100001

using namespace std;

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

int viz[NRMAX],n,m,pp[NRMAX];
vector<int> lis[NRMAX];
stack<int> sol;

void read();
void conex();
void solve();
void dfs();

int main()
{
	read();
	conex();
	solve();
	f.close();g.close();
	return 0;
}

void read()
{
	f>>n>>m;
	for (int i=1;i<=m;i++)
	{
		int l,c;f>>l>>c;
		lis[l].push_back(c);
		lis[c].push_back(l);
	}
}

void conex()
{
	dfs();
	for (int i=1;i<=n;i++)
		if (viz[i]==0 || lis[i].size()%2==1) 
		{g<<"-1"<<'\n';f.close();g.close();exit(0);}
}

void dfs()
{
	queue<int>que;
	que.push(1);
	while (!que.empty())
	{
		int aux=que.front();que.pop();
		for (int i=0;i<lis[aux].size();i++)
			if (viz[lis[aux][i]]==0)
			{
				viz[lis[aux][i]]=1;
				que.push(lis[aux][i]);
			}
	}
}

void solve()
{
	sol.push(1);int nr=0;
	while (sol.size()>0)
	{
		int aux=sol.top();
		if (lis[aux].size()==0) 
		{if (nr<m) g<<aux<<' ',nr++;sol.pop();}
		else
		{
			int val=lis[aux][0];lis[aux].erase(lis[aux].begin());
			for (int it=0;it<lis[val].size();it++)
				if (lis[val][it]==aux)
				{
					lis[val].erase(lis[val].begin()+it);
					break;
				}
			sol.push(val);
		}
	}
}