Cod sursa(job #2927578)

Utilizator LuciBBadea Lucian LuciB Data 20 octombrie 2022 21:24:15
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 1e5;
const int MMAX = 5e5;

struct edge {
    int node, index;
};
vector<edge> multigraph[NMAX + 1];
stack<int> recursionStack;
stack<int> ansCycle;
bool viz[MMAX];

int main() {
    int n, m;
    FILE *fin, *fout;
    fin = fopen("ciclueuler.in", "r");
    fout = fopen("ciclueuler.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for(int i = 0; i < m; i++) {
        int a, b;
        fscanf(fin, "%d%d", &a, &b);
        multigraph[a].push_back({b, i});
        multigraph[b].push_back({a, i});
    }
    int Node = 1;
    while(Node <= n && multigraph[Node].size() % 2 == 0)
        Node++;
    if(Node == n + 1) {
        recursionStack.push(1);
        while(!recursionStack.empty()) {
            Node = recursionStack.top();
            if(!multigraph[Node].empty()) {
                edge Edge = multigraph[Node].back();
                multigraph[Node].pop_back();
                if(!viz[Edge.index]) {
                    viz[Edge.index] = true;
                    recursionStack.push(Edge.node);
                }
            } else {
                ansCycle.push(Node);
                recursionStack.pop();
            }
        }
        ansCycle.pop();
        while(!ansCycle.empty()) {
            fprintf(fout, "%d ", ansCycle.top());
            ansCycle.pop();
        }
    } else {
        fprintf(fout, "-1");
    }

    fclose(fin);
    fclose(fout);
    return 0;
}