Cod sursa(job #2432597)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 24 iunie 2019 14:04:10
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#define MAX (int)(1e5+5)
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

int n;
bool eulerian,Used[MAX*5];
stack <int> Stk;
vector <int> Ans;
vector <pair <int,int>> Edge[MAX];//first-nod, second-cod_muchie

void read();
void solve();
void print();

int main(){
    read();
    solve();
    if(!eulerian){
        fout<<-1;
        return 0;
    }
    print();
    return 0;
}
void print(){
    for(int i=0;i<Ans.size()-1;++i){
        fout<<Ans[i]<<' ';
    }
}
void solve(){
    int i,x,y,id;
    for(i=1;i<=n;++i)
        if(Edge[i].size()%2)
            return;

    Stk.push(1);
    while(!Stk.empty()){
        x=Stk.top();
        while(!Edge[x].empty()&&Used[Edge[x].back().second]){//verific daca mai are muchii valabile
            Edge[x].pop_back();
        }

        if(!Edge[x].empty()){
            y=Edge[x].back().first;
            id=Edge[x].back().second;
            Edge[x].pop_back();

            if(!Used[id]){
                Used[id]=1;
                Stk.push(y);
            }

        }else{
            Ans.push_back(x);
            Stk.pop();
        }
    }

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