Cod sursa(job #640251)

Utilizator swift90Ionut Bogdanescu swift90 Data 25 noiembrie 2011 00:10:51
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
int N,M,cnt,poz;
typedef pair <int,int> hh;
vector <bool> fol(500010,false);
vector <hh> nr[100010];
vector <bool> viz(100100,false);
queue <int> Q;
stack <int> S;
unsigned int s[100100];
void df(){/*
	if(viz[x])
		return;
	viz[x]=1;
	--cnt;
	for(int i=0;i<s[x];++i)
		df(nr[x][i].fs);*/
	int x;
	viz[1]=true;
	S.push(1);
	while(!S.empty()){
		x=S.top();
		while(s[x]<nr[x].size()){
			if(viz[nr[x][s[x]].first])
				++s[x];
			else
				break;
		}
		if(s[x]==nr[x].size()){
			--cnt;
			S.pop();
			continue;
		}
		S.push(nr[x][s[x]].first);
		viz[nr[x][s[x]].first]=true;
		++s[x];
	}
}
void euler(){/*
	for(int i=0;i<s[x];++i){
		if(!fol[ nr[x][i].sc ]){
			fol[ nr[x][i].sc ]=1;
			euler(nr[x][i].fs);
		}
	}*/
	int x;
	S.push(1);
	while(!S.empty()){
		x=S.top();
		while(s[x]<nr[x].size()){
			if(fol[ nr[x][s[x]].second ])
				++s[x];
			else
				break;
		}
		if(s[x]==nr[x].size()){
			Q.push(x);
			S.pop();
			continue;
		}
		fol[ nr[x][s[x]].second ]=1;
		S.push(nr[x][s[x]].first);
		++s[x];
	}
}
int main(){
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	int i,x,y;
	scanf("%d%d",&N,&M);
	for(i=1;i<=M;++i){
		scanf("%d%d",&x,&y);
		nr[x].push_back( hh(y,i) );
		nr[y].push_back( hh(x,i) );
	}
	for(i=1;i<=N;++i){
		if(nr[i].size()%2){
			printf("-1\n");
			fclose(stdin);
			fclose(stdout);
			return 0;
		}
	}
	
	cnt=N;
	df();
	if(cnt){
		printf("-1\n");
		fclose(stdin);
		fclose(stdout);
		return 0;
	}
	for(i=0;i<=N;++i)
		s[i]=0;
	euler();
	Q.pop();
	for(;!Q.empty();Q.pop())
		printf("%d ",Q.front());
	printf("\n");
	fclose(stdin);
	fclose(stdout);
	return 0;
}