Cod sursa(job #750997)

Utilizator ChallengeMurtaza Alexandru Challenge Data 23 mai 2012 20:20:09
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

const char InFile[]="euler.in";
const char OutFile[]="euler.out";
const int MaxN=100111;
const int MaxM=500111;

ifstream fin(InFile);
ofstream fout(OutFile);

struct EdgeTo
{
	EdgeTo(int to=0, int index=0):to(to),index(index){};

	int to,index;
};

int N,M,x,y;
char viz[MaxN],vizEdge[MaxM];
vector<EdgeTo> G[MaxN];
vector<int> vsol;
stack<int> S;

void DFS(int nod)
{
	viz[nod]=1;
	for(vector<EdgeTo>::iterator it=G[nod].begin();it!=G[nod].end();++it)
	{
		if(!viz[it->to])
		{
			DFS(it->to);
		}
	}
}

inline bool Euler()
{
	for(register int i=1;i<=N;++i)
	{
		if(G[i].size()%2==1)
		{
			return false;
		}
	}

	DFS(1);

	for(register int i=1;i<=N;++i)
	{
		if(!viz[i] && G[i].size()>0)
		{
			return false;
		}
	}

	for(register int i=1;i<=N;++i)
	{
		if(viz[i])
		{
			S.push(i);
			break;
		}
	}

	while(!S.empty())
	{
		int nod=S.top();
		if(G[nod].size()==0)
		{
			S.pop();
			vsol.push_back(nod);
		}
		else
		{
			EdgeTo E=G[nod][G[nod].size()-1];
			if(!vizEdge[E.index])
			{
				S.push(E.to);
				vizEdge[E.index]=1;
			}
			G[nod].pop_back();
		}
	}

	return true;
}

int main()
{
	fin>>N>>M;
	for(register int i=1;i<=M;++i)
	{
		fin>>x>>y;
		G[x].push_back(EdgeTo(y,i));
		G[y].push_back(EdgeTo(x,i));
	}
	fin.close();

	if(!Euler())
	{
		fout<<"-1";
	}
	else
	{
		vector<int>::iterator last=vsol.end();
		--last;
		for(vector<int>::iterator it=vsol.begin();it!=last;++it)
		{
			fout<<*it<<" ";
		}
	}
	fout.close();
	return 0;
}