Cod sursa(job #238888)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 3 ianuarie 2009 16:27:11
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
#include<stdio.h>
#define N 100010
#define M 500010
struct nod { int edge;nod *urm;};
nod *pp,*qq,*prim[N],*ultim[N];
int eulerian,n,m,i,aa,bb,gg[N],dad[N],nc,ga[N],nn,a[M],b[M],tip[M],
bucla=1,arbore=2,eliminat=3,tipp,ee;
void readd(),add_edge(),dfs(int NOD);
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",&a[i],&b[i]);
	  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;
	  while(tip[prim[nc]->edge]==eliminat)prim[nc]=prim[nc]->urm;
	  if(gg[nc]>ga[nc])
	  {  for(;;)
	     { tipp=tip[prim[nc]->edge];
	       if(tipp==eliminat)
	       { prim[nc]=prim[nc]->urm;
		 continue;
	       }
	       if(tipp==arbore)
	       { ultim[nc]->urm=prim[nc];
		 prim[nc]=prim[nc]->urm;
		 ultim[nc]=ultim[nc]->urm;
		 ultim[nc]->urm=0;
		 continue;
	       }
	       break;
	     }
	     ee=prim[nc]->edge;
	     tip[ee]=eliminat;
	     printf("%d ",nc);
	     if(tipp==bucla){gg[nc]-=2;continue;}
	     gg[nc]--;
	     nc=a[ee]+b[ee]-nc;
	     gg[nc]--;
	     continue;
	  }
	  printf("%d ",nc);
	  while(tip[prim[nc]->edge]==eliminat)prim[nc]=prim[nc]->urm;
	  gg[nc]--;ga[nc]--;
	  ee=prim[nc]->edge;
          tip[ee]=eliminat;
	  nc=a[ee]+b[ee]-nc;
	  gg[nc]--;ga[nc]--;
	}
}
void add_edge()
{       if(a[i]==b[i])
	{ gg[a[i]]+=2;
	  pp=new nod;
	  pp->edge=i;
	  pp->urm=0;
	  if(!prim[a[i]])prim[a[i]]=ultim[a[i]]=pp;
	  else {ultim[a[i]]->urm=pp;ultim[a[i]]=pp;}
	  tip[i]=bucla;
	  return;
	}
	gg[a[i]]++;gg[b[i]]++;
	pp=new nod;
	pp->edge=i;pp->urm=0;
	if(!prim[a[i]])prim[a[i]]=ultim[a[i]]=pp;
	else {ultim[a[i]]->urm=pp;ultim[a[i]]=pp;}
	pp=new nod;
	pp->edge=i;pp->urm=0;
	if(!prim[b[i]])prim[b[i]]=ultim[b[i]]=pp;
	else {ultim[b[i]]->urm=pp;ultim[b[i]]=pp;}

}
void dfs(int tt)
{       nod *paux;int ff;
	for(paux=prim[tt];paux;paux=paux->urm)
	{ ee=paux->edge;
	  ff=a[ee]+b[ee]-tt;
	  if(ff>1&&!dad[ff])
	  { dad[ff]=tt;
	    ga[ff]++;ga[tt]++;
	    tip[ee]=arbore;
	    dfs(ff);
	  }
	 }
}