Cod sursa(job #1599618)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 14 februarie 2016 01:33:05
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#define Nmax 500005
using namespace std;
vector<int> G[Nmax],sol;
stack<int> S;
bitset<Nmax> used;
int N,M;
int bad = 0;

void Read()
{
    scanf("%d%d",&N,&M);
    int a,b;
    for(int i = 1; i <= M; ++i)
    {
        scanf("%d%d",&a,&b);
        G[a].push_back(b);
        G[b].push_back(a);
    }
}
void DFS(int k)
{
    used[k] = 1;
    for(auto it : G[k])
        if(!used[it])
            DFS(it);
}

void Euler(int crt)
{
    int next;
    do{
        /// while we have not finished a cycle, pick an edge, travel along it and delete it
        while(G[crt].size()){
            S.push(crt);
            next = G[crt].back();
            G[crt].pop_back();
            G[next].erase(find(G[next].begin(),G[next].end(),crt));
            crt = next;
        }
        crt = S.top();
        sol.push_back(crt);
        S.pop();
    }while(!S.empty());
    for(auto it : sol)
        printf("%d ",it);
    ///printf("%d",sol[0]);
}

void Check()
{
    for(int i = 1; i <= N; ++i)
        if(G[i].size() % 2 == 1)
            bad = 1;
    DFS(1);
    for(int i = 1; i <= N; ++i)
        if(!used[i])
            bad = 1;
}

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

    Read();
    Check();
    if(bad)
        printf("-1");
    else
        Euler(1);

    return 0;
}