Cod sursa(job #330869)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 11 iulie 2009 20:38:16
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<stdio.h>
#include<vector>
#include<list>
#include<stack>
#include<algorithm>
using namespace std;
list <int> Graf[100010];
vector <int> Par,Ut,Rez;
stack <int> Stiva;
int n,m;
int Check()
{
	for(int i=1;i<=n;i++)
		if(Par[i]&1)
			return 0;
	Stiva.push(1);
	while(!Stiva.empty())
	{
		int Nod=Stiva.top();
		Stiva.pop();
		for(list <int> ::iterator it=Graf[Nod].begin();it!=Graf[Nod].end();it++)
		{
			if(Ut[*it])
				continue;
			Stiva.push(*it);
			Ut[*it]=1;
		}
	}
	if(find(Ut.begin()+1,Ut.end(),0)!=Ut.end())
		return 0;
	return 1;
}
void Delete(int x,int y)
{
	Graf[x].erase(Graf[x].begin());
	Graf[y].erase(find(Graf[y].begin(),Graf[y].end(),x));
}
void Ciclu(int x)
{
	while(!Graf[x].empty())
	{
		int y=Graf[x].front();
		Delete(x,y);
		Stiva.push(x);
		x=y;
	}
}
void Euler()
{
	int x=1;
	do
	{
		Ciclu(x);
		x=Stiva.top();
		Stiva.pop();
		Rez.push_back(x);
	}while(!Stiva.empty());
}
int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	scanf("%d%d",&n,&m);
	Ut.resize(n+1);Par.resize(n+1);
	for(int i=0;i<m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		Par[x]++;Par[y]++;;
		Graf[x].push_back(y);
		Graf[y].push_back(x);
	}
	if(!Check())
	{
		printf("-1");
		return 0;
	}
	Euler();
	for(vector <int> ::iterator it=Rez.begin();it!=Rez.end();it++)
		printf("%d ",*it);
	printf("\n");
	return 0;
}