Cod sursa(job #238860)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 3 ianuarie 2009 14:52:11
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include<stdio.h>
#define N 100001
struct nod { int inf,mult;nod *urm;};
nod *pp,*qq,*prim[N],*pd;
int eulerian,n,m,i,aa,bb,gg[N],dad[N],nc,ga[N],nn;
void readd(),add_edge(),dfs(int NOD),search();
int main()
{       readd();
	if(!eulerian){printf("-1\n");return 0;}
	return 0;
}
void readd()
{       freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{ scanf("%d%d",&aa,&bb);
	  add_edge();
	}
	for(i=1;i<=n;i++)
	 if(gg[i]&1){eulerian=0;return;}
	dfs(1);
	for(i=2;i<=n;i++)
	 if(!dad[i]){eulerian=0;return;}
	eulerian=1;
	nc=1;
	for(;;)
	{ if(!gg[nc])return;
	  if(gg[nc]>ga[nc])
	  {  printf("%d ",nc);
	     search();
	     nn=pp->inf;
	     if(nn==nc){pp->mult--;gg[nc]-=2;continue;}
	     for(qq=prim[nn];;qq=qq->urm)if(qq->inf==nc)break;
	     pp->mult--;gg[nc]--;
	     qq->mult--;gg[nn]--;
	     nc=nn;
             continue;
	  }
	  printf("%d ",nc);
	  while(!prim[nc]->mult)
	   {pd=prim[nc];prim[nc]=prim[nc]->urm;delete pd;}
	  nn=prim[nc]->inf;
	  prim[nc]->mult--;gg[nc]--;ga[nc]--;
	  for(pp=prim[nn];;pp=pp->urm)if(pp->inf==nc)break;
	  pp->mult--;gg[nn]--;ga[nn]--;
	  nc=nn;
	}
}
void add_edge()
{       if(aa==bb)
	{ gg[aa]+=2;
	  for(pp=prim[aa];pp;pp=pp->urm)
	   if(pp->inf==aa)
	   { pp->mult++;return;}
	  pp=new nod;
	  pp->inf=aa;
	  pp->mult=1;
	  pp->urm=prim[aa];
	  prim[aa]=pp;
	  return;
	}
	gg[aa]++;gg[bb]++;
	for(pp=prim[aa];pp;pp=pp->urm)
	 if(pp->inf==bb)break;
	if(pp)
	{ while(!prim[bb]->mult)
	  {pd=prim[bb];prim[bb]=prim[bb]->urm;delete pd;}
	  for(qq=prim[bb];qq;qq=qq->urm)
	   if(qq->inf==aa)break;
	   pp->mult++;
	   qq->mult++;
	   return;
	}
	pp=new nod;
	pp->inf=bb;pp->mult=1;pp->urm=prim[aa];prim[aa]=pp;
	pp=new nod;
	pp->inf=aa;pp->mult=1;pp->urm=prim[bb];prim[bb]=pp;
}
void dfs(int NOD)
{       nod *paux;
	for(paux=prim[NOD];paux;paux=paux->urm)
	 if(paux->inf>1&&!dad[paux->inf])
	 { dad[paux->inf]=NOD;
	   ga[NOD]++;
	   ga[paux->inf]++;
	   dfs(paux->inf);
	 }
}
void search()
{       while(!prim[nc]->mult)
	 {pd=prim[nc];prim[nc]=prim[nc]->urm;delete pd;}
	for(pp=prim[nc];;pp=pp->urm)
	{ if(pp->mult==1&&(dad[pp->inf]==nc||dad[nc]==pp->inf))continue;
	  return;
	}
}