Cod sursa(job #2324852)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 21 ianuarie 2019 16:59:44
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>
#include <deque>
#define DIM 500010
using namespace std;

ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");
int n,m,i,nod,vecin,ok,x,y;
int f[DIM],g[DIM];
vector < pair<int,int> > L[DIM];
deque <int> q;
void dfs (int nod){
    f[nod] = 1;
    for (int i=0;i<L[nod].size();i++){
        int vecin = L[nod][i].first;
        if (!f[vecin])
            dfs (vecin);
    }
}
int main (){

    fin>>n>>m;
    for (i=1;i<=m;i++){
        fin>>x>>y;
        L[x].push_back (make_pair(y,i));
        L[y].push_back (make_pair(x,i));
        g[x]++, g[y]++;
    }

    dfs (1);
    for (i=1;i<=n;i++){
        if (g[i] % 2 == 1){
            fout<<-1;
            return 0;
        }
        f[i] = 0;
    }
    q.push_back(1);
    while (!q.empty()){
        nod = q.back();
        if (!g[nod]){
            /// am terminat toate nodurile deci inseamna ca trebuie sa il afisez
            if (!ok){
                q.pop_back();
                ok = 1;
            } else{
                fout<<nod<<" ";
                q.pop_back();
            }
        } else {
            while (L[nod].size()!=0 && f[L[nod].back().second])
                L[nod].pop_back();

            int vecin = L[nod].back().first;
            g[vecin]--, g[nod]--;
            f[L[nod].back().second] = 1;
            q.push_back (vecin);
        }
    }


    return 0;
}