Cod sursa(job #1018504)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 29 octombrie 2013 18:04:37
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>
#include <vector>
#include <algorithm>


using namespace std;
FILE *f=fopen("ciclueuler.in","r");
FILE *g=fopen("ciclueuler.out","w");

vector<int>l[100005];
int gr[100005],st[500005],i,n,m,x,y,cd[500005],p,nr,k,ok=0;

int verif()
{
  int i,ok=0;
 for(i=1;i<=n;i++)
  {
    gr[i]=l[i].size();
   if ((l[i].size())%2==1)ok=1;
  }
if (ok==0)return 1;
else return 0;
}

void df(vector<int>c,int i)
{

for (vector<int>::iterator it=c.begin();it!=c.end();++it)
   if (ok==0)
    {
       x=*it;
       gr[x]--;
       gr[i]--;
       st[nr]=x;
        l[i].erase(l[i].begin());
        l[x].erase(find(l[x].begin(),l[x].end(),i));
         nr++;
      if (st[p]==*it)
       {
      nr-=1;
      k++;
      cd[k]=st[p];
      p=nr-1;
      while (gr[st[p]]==0 && p>0)p--;
      if (gr[st[p]]==0)ok=1;
      else df(l[st[p]],st[p]);
       }
     else if (gr[x]>=0) df(l[x],x);
}

}




int main()
{

fscanf(f,"%d%d",&n,&m);

for(i=1;i<=m;i++)
{
fscanf(f,"%d%d",&x,&y);
l[x].push_back(y);
l[y].push_back(x);
}
if (verif()==0)fprintf(g,"%d",-1);
 else
 {nr=2;p=1;st[1]=1;
  df(l[1],1);
  nr--;
  for(i=1;i<=nr;i++)
  fprintf(g,"%d ",st[i]);
 for(i=k;i>=2;i--)
 fprintf(g,"%d ",cd[i]);

 }




fclose(g);
return 0;
}