Cod sursa(job #2927929)

Utilizator Teodor94Teodor Plop Teodor94 Data 21 octombrie 2022 21:01:50
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
using namespace std;

#define NO_NODES 100000

int noNodes, noEdges;
vector<int> graph[NO_NODES];

vector<int> cycle;

void addEdge(int x, int y) {
    graph[x].push_back(y);
    graph[y].push_back(x);
}

bool checkDegrees() {
    int node;

    node = 0;
    while (node < noNodes && graph[node].size() % 2 == 0)
        ++node;
    
    return node == noNodes;
}

void euler(int node) {
    int neighbour;

    while (graph[node].size()) {
        neighbour = graph[node].back();

        graph[node].pop_back();
        graph[neighbour].erase(find(graph[neighbour].begin(), graph[neighbour].end(), node));
        --noEdges;

        euler(neighbour);
    }

    cycle.push_back(node);
}

int main() {
    FILE* fin = fopen("ciclueuler.in", "r");
    FILE* fout = fopen("ciclueuler.out", "w");

    int x, y, i;

    fscanf(fin, "%d%d", &noNodes, &noEdges);
    for (i = 0; i < noEdges; ++i) {
        fscanf(fin, "%d%d", &x, &y);
        addEdge(x - 1, y - 1);
    }

    if (checkDegrees()) {
        euler(0);

        if (noEdges == 0) {
            cycle.pop_back();
            for (int node : cycle)
                fprintf(fout, "%d ", node + 1);
        } else
            fprintf(fout, "-1\n");
    } else
        fprintf(fout, "-1\n");

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