Cod sursa(job #727782)

Utilizator algotrollNume Fals algotroll Data 28 martie 2012 11:53:20
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<fstream>
#include<list>
#include<stack>
#include<vector>
#define _NM 100005
using namespace std;
typedef list<int>::iterator lit;

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

int main()
{
	ifstream fin("ciclueuler.in");
	ofstream fout("ciclueuler.out");
	int nN,nM;
	fin>>nN>>nM;
	list<int> vAd[_NM];
	for (int i=1;i<=nM;i++)
	{
		int nod1,nod2;
		fin>>nod1>>nod2;
		vAd[nod1].push_back(nod2);
		vAd[nod2].push_back(nod1);
	}
	for (int i=1;i<=nN;i++)
		if (vAd[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 (vAd[cur].size()==0)
		{
			sol.push_back(cur);
			s.pop();
		}
		else
		{
			s.push(vAd[cur].front());
			delete_edge(vAd, cur, vAd[cur].front());
		}
	}
	for (unsigned i=0;i<sol.size()-1;i++)
		fout<<sol[i]<<' ';
	return 0;
}