Cod sursa(job #754330)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 1 iunie 2012 17:38:57
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
                                                     
#include <fstream>
#include <set>
#include <vector>
#include <queue>
using namespace std;

int grad[100001];
int From[500005];
int To[500005];
int Taken[500005];
int ciclu[500005];
int cpos;
vector<int> *Nod;

int StNod[500001];
int SP;
int StMuch[500001];

int main(void)
{
 fstream fin("ciclueuler.in",ios::in);
 fstream fout("ciclueuler.out",ios::out);
 long Noduri,Muchii,i,a,b;
 fin >> Noduri >> Muchii;

 Nod = new vector<int>[100001];
 for (i = 1;i <= Noduri;i += 1)
  {
   Nod[i].reserve(100);
  }

 for (i = 0;i < Muchii;i += 1)
  {
   fin >> a >> b;
   From[i] = a;
   To[i] = b;
   grad[a] += 1;
   grad[b] += 1;
   Nod[a].push_back(i);
   Nod[b].push_back(i);
  }
 for (i = 1;i <= Noduri;i += 1)
  {
   if (grad[i] & 1)
     {
      fout << "-1";
      fin.close();
      fout.close();
      return 0;
     }
  }

 cpos = 0;
 SP = 0;
 SP = 0;
 StNod[SP] = 1;
 StMuch[SP] = 0;

 while (SP >= 0)
  {
   while (StMuch[SP] < Nod[StNod[SP]].size())
    {
     int muchi = StMuch[SP];
     int nod = StNod[SP];
     StMuch[SP] += 1;
     int tempmuch = Nod[nod][muchi];
     if (Taken[tempmuch])
       {
        continue;
       }
     Taken[tempmuch] = 1;
     SP += 1;
     if (From[tempmuch] == nod)
       {
        StNod[SP] = To[tempmuch];
       }
      else
       {
        StNod[SP] = From[tempmuch];
       }
     StMuch[SP] = 0;
//     Nod[nod].erase(Nod[nod].begin() + muchi);
    }
   ciclu[cpos] = StNod[SP];
   cpos += 1;
   SP -= 1;
  }

 for (cpos -= 1;cpos > 0;cpos -= 1)
  {
   fout << ciclu[cpos] << " ";
  }

 fin.close();
 fout.close();
 return 0;
}