Cod sursa(job #727846)

Utilizator algotrollNume Fals algotroll Data 28 martie 2012 12:21:07
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream>
#include<list>
#include<stack>
#include<vector>
#define _NM 100005
using namespace std;

inline
void delete_edge(list<int> lAd[], int nod1, int nod2)
{
	for (list<int>::iterator it=lAd[nod1].begin();it!=lAd[nod1].end();++it)
		if (*it==nod2)
		{
			lAd[nod1].erase(it);
			break;
		}
}

int main()
{
	ifstream fin("ciclueuler.in");
	ofstream fout("ciclueuler.out");
	int nN,nM;
	fin>>nN>>nM;
	static list<int> lAd[_NM];
	for (int i=1;i<=nM;i++)
	{
		int nod1,nod2;
		fin>>nod1>>nod2;
		lAd[nod1].push_back(nod2);
		lAd[nod2].push_back(nod1);
	}
	for (int i=1;i<=nN;i++)
		if (lAd[i].size()%2!=0)
		{
			fout<<-1;
			return 0;
		}
	//
	stack<int> s;
	vector<int> sol;
	s.push(1);
	while(!s.empty())
	{
		int cur=s.top();
		if (lAd[cur].size()==0)
		{
			sol.push_back(cur);
			s.pop();
		}
		else
		{
			s.push(lAd[cur].front());
			delete_edge(lAd,lAd[cur].front(),cur);
			lAd[cur].pop_front();
		}
	}
	for (unsigned i=0;i<sol.size()-1;i++)
		fout<<sol[i]<<' ';
	return 0;
}