Cod sursa(job #1596079)

Utilizator UngureanuRuxandraUngureanu Andreea Ruxandra UngureanuRuxandra Data 10 februarie 2016 19:33:59
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,m,x,y,p,u,k1,k,poz,i,nr,cd[100001],v[100001],d[100001],c[100001],c1[100001],a[5001][5001];
int main ()
{ f>>n>>m;
 for(i=1;i<=m;++i)
 {f>>x>>y;
  a[x][y]=a[y][x]=1;
  d[x]++;
  d[y]++;

 }
 p=1;
 u=1;
 cd[p]=1;
 v[1]=1;
 while(p<=u)
 {x=cd[p];
 p++;
 for(i=1;i<=n;++i)
        if(a[x][i]==1&&v[i]==0)
 {u++;
 cd[u]=i;
 v[i]=1;

 }
 }
 nr=0;
 for(i=1;i<=n;++i)
    if(d[i]%2!=0)
      nr++;
 if(nr==0&&u==n)

{k=1;
  c[1]=1;
  while(1)
  {x=c[k];
   for(i=1;i<=n;++i)
    if(a[x][i]==1)
   {k++;
   c[k]=i;
   d[x]--;
   d[i]--;
   a[x][i]=a[i][x]=0;
       break;
   }
      if(c[k]==c[1])
        break;
  }
  while(k<=m)
  {for(i=1;i<=k;++i)
     if(d[c[i]]>0)
     {poz=i;
     k1=i;
     c1[k1]=c[i];

     }
      while(1)
      {x=c1[k];
       for(i=1;i<=n;++i)
        if(a[x][i]==1)
       {k1++;
        c1[k1]=i;
        d[x]--;
        d[i]--;
        a[x][i]=a[i][x]=0;
           break;
       }
          if(c1[k1]==c1[1])
            break;
      }
      for(i=k;i>=poz;--i)
     c[i]=c[i]+k1-1;
      for(i=1;i<k1;++i)
        c[poz+1-1]=c1[i];
      k=k+k1-1;
  }
 if(c[1]==c[k])
    for(i=1;i<=k;++i)
      g<<c[i]<<' ' ;}
 else
    g<<"-1"<<'\n';

    return 0;
}