Cod sursa(job #611910)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 4 septembrie 2011 15:11:46
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream>
using namespace std;
struct nod{int info; nod *adr;}*v[100010];
int i,x,y,n,m,vf=1,ce[500010];
nod *p;
void elimina_muchie(int a,int b)
{
	nod *p=v[ce[a]];
	if(v[ce[a]]->info==ce[b]) v[ce[a]]=v[ce[a]]->adr;
	else
	{
	 while(p->adr->info!=ce[b]) p=p->adr;
	  p->adr=p->adr->adr;
	}
	 nod *q=v[ce[b]];
	if(v[ce[b]]->info==ce[a]) v[ce[b]]=v[ce[b]]->adr;
	else
	{
	  while(q->adr->info!=ce[a]) q=q->adr;
	  q->adr=q->adr->adr;
	}
}

void un_ciclu(int ind)
{
	p=v[ce[ind]];
	while(p)
	{
		for(i=++vf;i>ind;i--)ce[i]=ce[i-1];
		ce[++ind]=p->info;
		elimina_muchie(ind-1,ind);
		p=p->adr;
		un_ciclu(ind);
	}
}

int main()
{
	ifstream f("ciclueuler.in");ofstream g("ciclueuler.out");
	f>>n>>m;
	for(i=1;i<=m;i++)
	{
		f>>x>>y;
		nod *p=new nod;
		p->info=y; p->adr=v[x]; v[x]=p;
		nod *q=new nod;
		q->info=x; q->adr=v[y]; v[y]=q;
	}
	ce[1]=1;
   for(i=1;ce[i];i++)
	un_ciclu(i);
  if(ce[m+1]!=1)g<<-1;
	  else
	  for(i=1;i<=m;i++) g<<ce[i]<<" ";
	f.close();g.close();
return 0;}