Cod sursa(job #723562)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 25 martie 2012 16:40:28
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
                                                     
#include <fstream>
#include <set>
#include <stack>
#include <vector>
using namespace std;

long N[100001] = {0};
long From[500005] = {0};
long To[500005] = {0};
long Taken[500005] = {0};
set<long> *M;

int main(void)
{
 fstream fin("ciclueuler.in",ios::in);
 fstream fout("ciclueuler.out",ios::out);
 long Noduri,Muchii,i,a,b,ok;
 M = new set<long>[100001];
 fin >> Noduri >> Muchii;

 for (i = 0;i < Muchii;i += 1)
  {
   fin >> a >> b;
   From[i] = a;
   To[i] = b;
   Taken[i] = 0;
   M[a].insert(i);
   M[b].insert(i);
  }
 vector<long> V;
 stack<long> S;
 for (i = 1;i <= Noduri;i += 1)
  {
   if (N[i] == 1)
     {
      continue;
     }
   S.push(i);
   N[i] = 1;
   while (S.empty() == false)
    {
     a = S.top();
     S.pop();
     if (M[a].empty() == false)
       {
        ok = 0;
        while ((M[a].empty() == false) && (ok == 0))
         {
          i = *M[a].begin();
          if (Taken[i] == 0)
            {
             ok = 1;
            }
           else
            {
             M[a].erase(*M[a].begin());
            }
         }
        if (ok == 1)
          {
           M[To[i]].erase(i);
           M[From[i]].erase(i);
           if (From[i] == a)
             {
              S.push(To[i]);
              N[To[i]] = 1;
             }
            else
             {
              S.push(From[i]);
              N[From[i]] = 1;
             }
           Taken[i] = 1;
          }
       }
     V.push_back(a);
    }
   V.pop_back();
  }
 for (i = 0;i < V.size();i += 1)
  {
   fout << V[i] << " ";
  }
 fin.close();
 fout.close();
 return 0;
}