Cod sursa(job #369052)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 26 noiembrie 2009 22:31:11
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
# include <cstdio>
# include <vector>

using namespace std;

# define FIN "ciclueuler.in"
# define FOUT "ciclueuler.out"

# define MAX_N 100005
# define MAX_M 500005
# define pb push_back
# define f first
# define s second

int N, M, i;
int dg[MAX_M];
vector <int> G[MAX_N];
pair <int, int> P[MAX_M];

vector <int> Sol;
vector <int> Stack;

     void del_used_edge(int Nod)
     {
         for (; !G[Nod].empty();)
            if (dg[G[Nod].front()]) G[Nod].erase(G[Nod].begin());
            else return;
     }

     void euler()
     {
         int Nod, newNod;

         Nod = 1;
         Stack.pb(Nod);

         while (!Stack.empty())
         {
             del_used_edge(Nod);

             if (!G[Nod].empty())
             {

                 Nod == P[G[Nod].front()].f ? newNod = P[G[Nod].front()].s : newNod = P[G[Nod].front()].f;

                 dg[G[Nod].front()] = 1;
                 G[Nod].erase(G[Nod].begin());

                 Stack.pb(Nod = newNod);
             } else
             {
                 Nod = Stack.back();
                 del_used_edge(Nod);

                 if (G[Nod].empty())
                 {
                     Stack.pop_back();
                     Sol.pb(Nod);
                 }
             }
         }
     }

     int main()
     {
         freopen(FIN, "r", stdin);
         freopen(FOUT, "w", stdout);

         scanf("%d%d", &N, &M);

         for (i = 1; i <= M; ++i)
         {
             scanf("%d%d", &P[i].f, &P[i].s);

             ++dg[P[i].f]; ++dg[P[i].s];
             G[P[i].f].pb(i); G[P[i].s].pb(i);
         }

         for (i = 1; i <= N; ++i)
            if ((dg[i] & 1)) { printf("-1\n"); return 0; }

         memset(dg, 0, sizeof(dg));

         euler();

         memset(dg, 0, sizeof(dg));
         vector <int> :: iterator it;
         for (it = Sol.begin(); it != Sol.end(); ++it) dg[*it] = 1;
         for (i = 1; i <= N; ++i)
            if (!dg[i]) { printf("-1\n"); return 0; }

         Sol.pop_back();
         for (it = Sol.begin(); it != Sol.end(); ++it) printf("%d ", *it);

         return 0;
     }