Cod sursa(job #3197690)

Utilizator FredyLup Lucia Fredy Data 27 ianuarie 2024 11:51:46
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <list>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

#define limn 100005
#define limm 500005
int n, m;
list<int> G[limn];
int st[limm], dr;
int nod, vec;

int main()
{
    int x, y;
    fin>>n>>m;
    for(int i = 1; i <= m; i++) {
        fin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    
    // verificam daca graful permite un ciclu eulerian (adica e graf eulerian)
    for(int i = 1; i <= n; i++)
        if(G[i].empty() || G[i].size() % 2) {
            fout<<-1;
            return 0;
        }

    // incepem cu un nod aleator, de ex 1
    // cu st simulam recursivitatea
    st[++dr] = 1;
    while(dr) {
        nod = st[dr];
        while(!G[nod].empty()) {
            vec = G[nod].back();
            G[nod].pop_back();    // stergem muchia nod-vec
            G[vec].erase( find(G[vec].begin(), G[vec].end(), nod));
            st[++dr] = vec;
            nod = vec;
        }
        if(dr > 1) 
            fout<<st[dr]<<' ';
        dr--;
    }
    
    return 0;
}