Cod sursa(job #754319)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 1 iunie 2012 17:05:50
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
                                                     
#include <fstream>
#include <set>
#include <stack>
#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;

stack<int> StNod;
stack<int> StMuch;

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 = 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;
 StNod.push(1);
 StMuch.push(0);

 while (StNod.size() > 0)
  {
   while (StMuch.top() < Nod[StNod.top()].size())
    {
     int muchi = StMuch.top();
     int nod = StNod.top();
     StMuch.pop();
     StMuch.push(muchi + 1);
     if (Taken[Nod[nod][muchi]])
       {
        continue;
       }
     if (From[Nod[nod][muchi]] == nod)
       {
        Taken[Nod[nod][muchi]] = 1;
        StNod.push(To[Nod[nod][muchi]]);
        StMuch.push(0);
       }
      else
       {
        Taken[Nod[nod][muchi]] = 1;
        StNod.push(From[Nod[nod][muchi]]);
        StMuch.push(0);
       }
    }
   ciclu[cpos] = StNod.top();
   cpos += 1;
   StNod.pop();
   StMuch.pop();
  }

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

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