Cod sursa(job #369050)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 26 noiembrie 2009 22:17:46
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 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;
                 Stack.pb(newNod);
                 dg[G[Nod].front()] = 1;
                 G[Nod].erase(G[Nod].begin());
                 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);
         
         int a, b;
         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;
     }