Cod sursa(job #2426185)

Utilizator vancea.catalincatalin vancea.catalin Data 26 mai 2019 17:06:52
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
#include <vector>

#define NMAX 100005
#define MMAX 500005
using namespace std;

fstream fin("ciclueuler.in",ios::in),fout("ciclueuler.out",ios::out);

int n, m;
vector<int> v[NMAX];
vector<int> cycle;
vector<int> result;
stack<int> st;

void read_data()
{
    int i,x,y;
    fin>>n>>m;
    for(i = 1; i<=m; i++)
    {
        fin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
}

int check_euler()
{
    int start_node = 1, num_odd = 0, i;
    for(i = 1; i<=n; i++)
    {
        if(v[i].size() % 2 == 1)
        {
            return -1;
            start_node = i;
            num_odd ++;
        }
    }
    if(num_odd > 0 && num_odd != 2){
        return -1;
    }
    return start_node;
}

void make_cycle()
{
    int start_node = 1, new_node, node;
    st.push(start_node);
    while(st.empty()==false)
    {
        node = st.top();
        if(v[node].empty() == false)
        {
            new_node = v[node].back();
            v[node].pop_back();
            v[new_node].erase(find(v[new_node].begin(), v[new_node].end(), node));
            st.push(new_node);
        }
        else
        {
            if(st.size()!=1)
                fout<<node<<"\n";
            st.pop();
        }
    }
}


void solve()
{
    int i;
    if(check_euler() != -1)
    {
        make_cycle();
    }
    else
    {
        fout<< "-1";
    }
    fout<<"\n";
}


int main()
{
    read_data();
    solve();
    return 0;
}