Cod sursa(job #1929189)

Utilizator LazarAndreiLazar Andrei Teodor LazarAndrei Data 17 martie 2017 11:32:42
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
using namespace std;


int nodes, edges, to[500005], from[500005];
bool deleted[500005];
vector <int> G[100005];
vector <int> S;
vector <int> ans;

bool isEuler () {
    for (int i = 1; i <= nodes; ++ i) {
        if (G[i].size() % 2 == 1)
        return false;
    }

    return true;
}

int Find_Next (int edge, int node) {
   return (from[edge] == node ) ? to[edge] : from[edge];
}

void Run_Euler () {
     S.push_back (1);

     while (!S.empty ()) {
        int crt_node = S.back ();

        if (!G[crt_node].empty()) {
            int edge = G[crt_node].back ();
            G[crt_node].pop_back ();

            if(deleted[edge])
                continue;

            deleted[edge] = true;
            S.push_back (Find_Next (edge, crt_node));
        }
       else {
          S.pop_back();
          ans.push_back (crt_node);
       }
     }
     ans.pop_back ();

     for (auto &it: ans) {
        printf ("%d ", it);
     }
}


int main()
{
    freopen ("ciclueuler.in", "r", stdin);
    freopen ("ciclueuler.out", "w", stdout);

    scanf ("%d%d", &nodes, &edges);

    for (int i = 1; i <= edges; ++ i) {
        int node1, node2;
        scanf ("%d%d", &node1, &node2);
        G[node1].push_back (i);
        G[node2].push_back (i);
        from[i] = node1;
        to[i] = node2;
    }

    if (isEuler ()) {
        Run_Euler ();
    }
    else {
        printf ("-1\n");
    }

   return 0;
}