Cod sursa(job #2135654)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 18 februarie 2018 23:50:10
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

int n, m;

pair<int, int> muchii[500005];
vector<int> vecini[100005];
int viz[500005];

void citire(){
    scanf("%d %d", &n, &m);

    int x, y;

    for(int i = 0; i < m; i++){
        scanf("%d %d", &x, &y);
        x--;
        y--;

        muchii[i] = {x, y};

        vecini[x].push_back(i);
        vecini[y].push_back(i);
    }
}

void solve(){
    for(int i = 0; i < n; i++){
        if(vecini[i].size() % 2 != 0){
            printf("-1");
            return;
        }
    }

    stack<int> Q;
    Q.push(0);

    while(!Q.empty()){
        int x = Q.top();

        if(vecini[x].size() > 0){
            int y = vecini[x].back();
            vecini[x].pop_back();

            if(viz[y] == false){
                viz[y] = true;

                int x1 = muchii[y].first;
                int x2 = muchii[y].second;

                if(x2 == x){
                    swap(x1, x2);
                }

                Q.push(x2);
            }
        }
        else{
            Q.pop();

            if(Q.empty() == false){
                printf("%d ", x + 1);
            }
        }
    }
}

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

    citire();
    solve();

    return 0;
}