Cod sursa(job #1506947)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 21 octombrie 2015 09:07:41
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>

#define MMAX 500007
#define NMAX 100007
#define pb push_back

using namespace std;
int n, m, aux;
char viz[MMAX];
struct muchie
{
    int x;
    int y;
} E[MMAX];
vector <int> adj[NMAX], sol;
stack <int> dfs;

int main()
{
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(int i = 1; i<= m; ++i)
    {
        scanf("%d %d", &E[i].x, &E[i].y);
        adj[E[i].x].pb(i);
        adj[E[i].y].pb(i);
    }
    for(int i = 1; i<= n; ++i)
    {
        if(adj[i].size()&1)
        {
            printf("-1\n");
            return 0;
        }
    }
    dfs.push(1);
    while(!dfs.empty())
    {
        int nod = dfs.top();
        //printf("start dfs nod = %d\n", nod);
        while(viz[adj[nod][0]] && !adj[nod].empty())
        {
            swap(adj[nod][0], adj[nod][adj[nod].size()-1]);
            adj[nod].pop_back();
        }
        if(!adj[nod].size())
        {
            //printf("check nod = %d\n", nod);
            sol.pb(nod);
            dfs.pop();
            continue;
        }
        viz[adj[nod][0]] = 1;
        if(nod != E[adj[nod][0]].x) aux = E[adj[nod][0]].x;
        else aux = E[adj[nod][0]].y;
        //printf("got to %d\n", aux);
        dfs.push(aux);
        swap(adj[nod][0], adj[nod][adj[nod].size()-1]);
        adj[nod].pop_back();
    }
    int sze = sol.size();
    for(int i = 0; i< sze; ++i) printf("%d ", sol[i]);
    printf("\n");
    return 0;
}