Cod sursa(job #3122782)

Utilizator 222cezarCezar Stilpeanu 222cezar Data 20 aprilie 2023 17:47:59
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 500500;
const int M = 500500;

struct muchie {
    int u, v;
} e[M];

bool sterse[M];
int n, m, prim[N];
vector<int> g[N];
vector<int> ciclu_eulerian;

bool tt_grade_pare() {
    for(int i = 1; i <= n; i++)
        if(g[i].size() & 1)
            return false;

    return true;
}

inline int celalalt_varf(muchie edge, int un_varf) { return (edge.u + edge.v - un_varf); }

void euler(int u) {
    while(prim[u] < g[u].size()) {
        int current_edge_index = g[u][prim[u]++];
        muchie edge = e[current_edge_index];
        if(!sterse[current_edge_index]) {
            sterse[current_edge_index] = true;
            euler(celalalt_varf(edge, u));
        }
    }

    ciclu_eulerian.push_back(u);
}

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

    scanf("%d%d", &n, &m);

    for(int i = 0; i < m; i++) {
        scanf("%d%d", &e[i].u, &e[i].v);
        g[e[i].u].push_back(i);
        g[e[i].v].push_back(i);
    }

    if(!tt_grade_pare()) {
        printf("-1\n");
        exit(0);
    }

    euler(1);

    if(ciclu_eulerian.size() != m + 1) {
        printf("-1\n");
        exit(0);
    }

    for(int i = 0; i < ciclu_eulerian.size() - 1; i++)
        printf("%d ", ciclu_eulerian[i]);
}