Cod sursa(job #652018)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 22 decembrie 2011 18:44:00
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<cstdio>
#include<vector>
#define MAX 500001
using namespace std;
int viz[MAX],S[MAX],n,m,x,y,D[MAX],T[MAX];
vector <pair<int,int > >G[MAX];
void citire(){
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i){
		scanf("%d%d",&x,&y);
		G[x].push_back(make_pair(y,i));
		G[y].push_back(make_pair(x,i));
		D[x]++;
		D[y]++;
	}
}
void dfs(int x){
	viz[x]=1;
	for(int i=0; i<G[x].size();++i)
		if(!viz[G[x][i].first])
			dfs(G[x][i].first);
}
void euler (){
	int k=0;
	S[++k]=1;
	while(k){
		if(G[S[k]].empty()){
			printf("%d ",S[k]);
			--k;
		}
		else{
			if(T[G[S[k]][G[S[k]].size()-1].second])
				G[S[k]].pop_back();
			else{
				S[++k]=G[S[k-1]][G[S[k-1]].size()-1].first;
				T[G[S[k-1]][G[S[k-1]].size()-1].second]=1;
			}
		}
	}
}int main (){
	citire();
	dfs(1);
	int check =0;
	for(int i=1; i<=n;++i)
		if((!viz[i]&&D[i])||(D[i]%2)){
			check=1;
			break;
		}
	if(!check)
		euler();
	else
		printf("-1");
	return 0;
}