Cod sursa(job #606552)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 4 august 2011 18:59:01
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include<fstream.h>
#define N 100001
typedef struct nod
{long info;
nod *urm;}Nod;
long a[5*N],b[5*N],d[5*N],i,n,m,k,w[N],*g[N],j,c[N],t;
Nod *l,*r;
void ci(long *g[N],long w[N],Nod *&l)
{long e,f;
Nod *p=l,*r,*q=l->urm;
do
       {for(i=0;i<w[p->info];i++)
               {j=g[p->info][i],k=i;
               break;}
       for(e=k;e<w[p->info]-1;e++)
               g[p->info][e]=g[p->info][e+1];
       w[p->info]--;
       for(t=0;t<w[j];t++)
       if(g[j][t]==p->info)
               {k=t;
               break;}
       for(f=k;f<w[j]-1;f++)
               g[j][f]=g[j][f+1];
       w[j]--;
       r=new Nod;
       r->info=j,r->urm=NULL,p->urm=r,p=r;}
while(r->info!=l->info);
p->urm=q;}
int ad(long *g[N],long w[N],Nod *&l)
{long gasit=0;
Nod *p=l;
while(p&&!gasit)
       {if(w[p->info]>0)
              gasit=1;
       if(!gasit)
              p=p->urm;}
if(p)
       {ci(g,w,p);
       return 1;}
else
       return 0;}
int gp(long *g[N],long w[N])
{long i,gasit=0;
for(i=1;i<=n&&gasit==0;i++)
if(w[i]%2==1)
       gasit=1;
return !gasit;}
void df(long *g[N],long w[N],long k)
{long i,sp=0,st[N];
st[++sp]=k;
c[k]=1;
while(sp>0)
      {j=st[sp--];
      for(i=0;i<w[j];i++)
      if(!c[g[j][i]])
             c[g[j][i]]=1,st[++sp]=g[j][i];}}
int co(long *g[N],long w[N],long n)
{long i,gasit=0;
df(g,w,1);
for(i=1;i<=n;i++)
if(!c[i])
      gasit=1;
return !gasit;}
int main()
{ifstream x("ciclueuler.in");
ofstream y("ciclueuler.out");
x>>n>>m;
for(i=1;i<=m;i++)
      x>>a[i]>>b[i],w[a[i]]++,w[b[i]]++;
for(i=1;i<=n;w[i++]=0)
      g[i]=(long*)malloc(w[i]*sizeof(long));
for(i=1;i<=m;i++)
      g[a[i]][w[a[i]]++]=b[i],g[b[i]][w[b[i]]++]=a[i];
if(!co(g,w,n)||!gp(g,w))
      y<<"-1";
else
      {l=new Nod;
      l->info=1,l->urm=NULL;
      while(ad(g,w,l));
      for(r=l->urm;r!=NULL;r=r->urm)
             y<<r->info<<" ";}
return 0;}