Cod sursa(job #1790896)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 28 octombrie 2016 20:47:10
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

int N, M, start = 1;
vector<vector<int> > G;
vector<int> road;
stack<int> s;
int in[666013],out[666013];

void deleteEdge(int from, int to)
{
    G[from].pop_back();
    G[to].erase(find(G[to].begin(), G[to].end(), from));
}

void euler(int k)
{
    int v;
    do {

        while(!G[k].empty()) {
            v = G[k].back();
            deleteEdge(k, v);
            s.push(k);
            k = v;
        }
        k = s.top(); s.pop();
        road.push_back(k);

    }while(!s.empty());
}

int used[666013], bad;

void DFS(int k)
{
    used[k] = 1;
    for(auto it : G[k])
        DFS(it);
}

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);

    cin.sync_with_stdio(false);

    cin >> N >> M;
    G.resize(N+1);

    for(int i = 1; i <= M; ++i) {
        int a, b;
        cin >> a >> b;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    if(bad) {
        cout << -1;
        return 0;
    }

    euler(start);
    reverse(road.begin(), road.end());
    for(auto it : road)
        cout << it << " ";


    return 0;
}