Cod sursa(job #1123455)

Utilizator iarbaCrestez Paul iarba Data 26 februarie 2014 08:31:18
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
using namespace std;
int st[100001],sf[100001],dest[1000001],next[1000001],euler[1000001],enext[1000001],prev[1000001];
int i,n,m,poz,x,y,q=0,aux;
void remove(int x,int nod)
{
	if(prev[x]==0){st[nod]=next[x];}
	if(next[x]==0){sf[nod]=prev[x];}
	next[prev[x]]=next[x];
	prev[next[x]]=prev[x];
}
void add(int x, int y)
{
	if(st[x]){next[sf[x]]=poz;}
	else{st[x]=poz;}
	prev[poz]=sf[x];dest[poz]=y;next[poz]=0;sf[x]=poz;
}
int reverse(int q){if(q%2){return q+1;}return q-1;}
void findcicle(int nod)
{
	x=st[nod];
	if(x==0){if(nod!=euler[i]){q=1;printf("-1");}return;}
	remove(reverse(x),dest[x]);
	remove(x,nod);
	poz++;
	euler[poz]=dest[x];
	enext[poz]=poz+1;
	findcicle(dest[x]);
}
int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	scanf("%ld%ld",&n,&m);
	for(i=1;i<=m;i++){
		scanf("%ld%ld",&x,&y);
		poz++;add(x,y);poz++;add(y,x);
					 }
	euler[1]=1;poz=1;
	for(i=1;i<=m;i++){
		if(euler[i]==0){printf("-1");q=1;}
		else{
			if(st[euler[i]]){
				aux=enext[i];
				enext[i]=poz+1;
				findcicle(euler[i]);
				enext[poz]=aux;
							}
			}
		if(q){return 0;}
					 }
	i=1;
	while(euler[enext[i]]){printf("%d ",euler[i]);i=enext[i];}
return 0;
}