Cod sursa(job #3201519)

Utilizator manudragoDragomir Manuel manudrago Data 8 februarie 2024 21:43:29
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

const int NMAX = 500005;
int viz[NMAX];
int grad[NMAX / 5];
int n, m;
vector < pair < int, int > > G[NMAX];

void read(){
    fin >> n >> m;
    for(int i = 0; i < m; i++){
        int x, y;
        fin >> x >> y;
        G[x].push_back({y, i});
        G[y].push_back({x, i});
        grad[x]++;
        grad[y]++;
    }
}

stack < int > st;
void euler(int nod){
    for(pair < int, int > much: G[nod]){
        int nbr = much.first;
        int i = much.second;
        if(!viz[i]){
            viz[i] = 1;
            euler(nbr);
        }
    }
    st.push(nod);
}

stack < int > st_dfs;
stack < int > st_ciclu;
void euler_optim(int nod){
    st_dfs.push(nod);
    while(!st_dfs.empty()){
        int nodc = st_dfs.top();
        if(G[nodc].size() > 0){
            auto [next_nod, idx_next] = G[nodc].back();
            G[nodc].pop_back();

            if(viz[idx_next] == 0){
                viz[idx_next] = 1;
                st_dfs.push(next_nod);
            }
        }
        else{
            st_dfs.pop();
            st_ciclu.push(nodc);
        }
    }
}

int main()
{
    read();
    for(int i = 1; i <= n; i++){
        if(grad[i] % 2 != 0){
            fout << -1;
            return 0;
        }
    }
    /// ALG 1
    /**
    euler(1);
    while(!st.empty()){
        fout << st.top() << " ";
        st.pop();
    }*/

    /// ALG 2
    euler_optim(1);
    while(!st_ciclu.empty()){
        fout << st_ciclu.top() << " ";
        st_ciclu.pop();
    }
    return 0;
}