Cod sursa(job #393506)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 9 februarie 2010 16:02:06
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
#include<vector>
#define Nmax 100010
#define Mmax 500010
using namespace std;

int n,m,i,j,a,b,S[Mmax],viz[Nmax],grad[Nmax],k,M[Mmax];
vector< pair <int,int > > V[Nmax];

void dfs(int nod)
{
	viz[nod]=1;
	int i,N=V[nod].size();
	
	for(i=0;i<N;i++)
		if(!viz[V[nod][i].first])
			dfs(V[nod][i].first);
}

void euler()
{
	int nod;
	while(k)
	{
		nod=S[k];
		if(!V[nod].empty())
		{
			if(!M[V[nod].back().second])
			{
				S[++k]=V[nod].back().first;
				M[V[nod].back().second]=1;
			}
			V[nod].pop_back();
		}
		else printf("%d ",S[k--]);
	}
}

int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for(i=1;i<=m;i++)
	{
		scanf("%d %d",&a,&b);
		
		grad[a]++;
		grad[b]++;
		V[a].push_back(make_pair(b,i));
		V[b].push_back(make_pair(a,i));
	}
	dfs(1);
	
	for(i=1;i<=n;i++)
	{
		if(grad[i]&1) {printf("-1");return 0;}
		if(!viz[i])   {printf("-1");return 0;}
	}
	
	S[++k]=1;
	euler();
	
	return 0;
}