Cod sursa(job #2351345)

Utilizator Anca.ioanaMuscalagiu Anca Ioana Anca.ioana Data 22 februarie 2019 11:12:50
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.47 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
 int n, m,Viz[100001],ce[500001], ce1[500001],Gr[100001],numar;
 vector <int>  L[100001];
  void Citire()
   { int i, x, y;
      f>>n>>m;

      while(f>>x>>y)
      {
        L[x].push_back(y);
        L[y].push_back(x);

      }
   }
 void DFS(int k)
 { Viz[k]=1;
  int j,nr;
  for(j=0;j<L[k].size();j++)
  { nr=L[k][j];
      if(Viz[nr]==0)
        DFS(nr);
  }

 }
 void Afisare()
 { int i,j ;
 cout<<n<<" "<<m<<endl;
     for(i=1;i<=n;i++)
     { cout<<i<<": ";
        for(j=0;j<L[i].size();j++)
         cout<<L[i][j]<<" ";
         cout<<endl;
     }
 }
  int main()
{ int i, k,nr,j,p;
Citire();
  DFS(1);
int ok=0;
  for(i=1;i<=n&&ok==0;i++)
     if(Viz[i]==0)
      ok=1;
if(ok==1)
    cout<<-1;
else   {  k=1;
         ok=0;
         for(i=1;i<=n&&ok==0;i++)
         {nr=L[i].size();
         if(nr%2==0)
           Gr[i]=nr;
          else ok=1;
           }
       if(ok==1)
        cout<<-1;

      }

if(ok==0)
 { ce[1]=1;k=1;
  do{
      for(j=0;j<L[ce[k]].size();j++)
        {  numar=L[ce[k]][j];
         L[ce[k]].erase(L[ce[k]].begin()+j);
          for(p=0;p<L[numar].size();p++)
            if(L[numar][p]==ce[k])
            {
            L[numar].erase(L[numar].begin()+p);
              break;
            }
           Gr[ce[k]]--;
           Gr[numar]--;
           k++;
           ce[k]=numar;
           break;
        }


    }while(ce[k]!=ce[1]);

 int v, k1;
  while(k<m+1)
   { for(i=1;i<=k;i++)
      if(Gr[ce[i]]>0)
       { v=i;
         ce1[1]=ce[i];
           k1=1;
           break;
       }
     do{
        for(j=0;j<L[ce1[k1]].size();j++)
          {      numar=L[ce1[k1]][j];
              L[ce1[k1]].erase(L[ce1[k1]].begin()+j);
               for(p=0;p<L[numar].size();p++)
                if(L[numar][p]==ce1[k1])
                 {
                 L[numar].erase(L[numar].begin()+p);
                   break;
                 }
           Gr[ce1[k1]]--;
           Gr[numar]--;
           k1++;
           ce1[k1]=numar;
           break;
          }
       }while(ce1[k1]!=ce1[1]);

     for(i=k;i>=v+1;i--)
        ce[i+k1-1]=ce[i];

     for(i=2;i<=k1;i++)
        ce[v+i-1]=ce1[i];
        //Afisare();

     k=k+k1-1;
   }

   for(i=1;i<=k-1;i++)
    g<<ce[i]<<" ";
 }
f.close();
g.close();
    return 0;
}