Cod sursa(job #2820550)

Utilizator mirunavrAvram Miruna-Alexandra mirunavr Data 20 decembrie 2021 19:23:24
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include<bits/stdc++.h>
using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

int n,m;
const int nMax=100001;
vector<int> v[nMax];
int d[100001],vis[500001],to[500001],from[500001],viz[500001];


vector<int> euler_cycle(){
    vector<int> ans;
    stack<int> st;
    int urmatorul_nod;
    for(int i=1;i<=n;i++)
    {
        if(d[i]%2 == 1)
        {
            ans.push_back(-1);
            return ans;
        }
    }

    st.push(1);
    while(!st.empty()){
        int node=st.top();
        if(!v[node].empty()){
            int numar_muchie=v[node].back();
            v[node].pop_back();
            if(viz[numar_muchie]==0) {
                viz[numar_muchie]=1;
                if (to[numar_muchie] != node)
                    urmatorul_nod = to[numar_muchie];
                else
                    urmatorul_nod = from[numar_muchie];
                st.push(urmatorul_nod);
            }
        }
        else{
            ans.push_back(st.top());
            st.pop();
        }
    }
   return ans;

}

int main() {

    int i,x,y;
    f>>n>>m;
    for(i=0;i<m;i++){
        f>>x>>y;
        d[x]++;
        d[y]++;
        v[x].push_back(i);
        v[y].push_back(i);
        from[i]=x;
        to[i]=y;
    }
    vector<int> ans;
    ans = euler_cycle();
    if(ans.size()==1)
        g<<ans[0];
    else
        for(i=0;i<ans.size()-1;i++)
            g<<ans[i]<<" ";
        
}