Cod sursa(job #2579573)

Utilizator TveinDenisDenis Tvein TveinDenis Data 12 martie 2020 16:59:52
Problema Ciclu Eulerian Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>

using std::cout;
using std::endl;
using std::cin;
using std::vector;
using std::queue;
using std::stack;
using std::fstream;
using std::ios;
using std::sort;

fstream file1("ciclueuler.in", ios::in);
fstream file2("ciclueuler.out", ios::out);

int nr_noduri, nr_muchii;
vector<int> vecini[100005];
vector<bool> vizitat(100005);
stack<int> stiva;

void form_vecini();
bool contine_ciclu_euler();
void dfs(int st);

int main(int argc, char** argv) {
    
    file1 >> nr_noduri >> nr_muchii;

    form_vecini();

    if (!contine_ciclu_euler()) {
        file2 << -1;
    }
    else {
        dfs(1);
        while (stiva.size() > 1) {
            file2 << stiva.top() << ' ';
            stiva.pop();
        }
    }

    file1.close();
    file2.close();
    return 0;
}

void dfs(int st) {
    stiva.push(st);
    while (!stiva.empty()) {
        int nod = stiva.top();

        if (!vecini[nod].size()) {
            return;
        }
        int temp = vecini[nod].back();
        stiva.push(temp);
        vecini[nod].pop_back();
        vecini[temp].erase(find(vecini[temp].begin(), vecini[temp].end(), nod));

    }
}

bool contine_ciclu_euler() {
    for (int i{ 1 }; i <= nr_noduri; i++) {
        if (vecini[i].size() % 2 == 1) {
            return false;
        }
    }
    return true;
}

void form_vecini() {
    int i, j;
    while (file1 >> i >> j) {
        vecini[i].push_back(j);
        vecini[j].push_back(i);
    }
}