Cod sursa(job #2075325)

Utilizator leraValeria lera Data 25 noiembrie 2017 12:51:45
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define Nmax 100005
#define Mmax 500005

using namespace std;

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

int n, m, a, b, g[Nmax], nod, x, fol[Mmax],viz[Nmax], ok;
vector < pair<int,int> > v[Nmax];
stack < int > st;
void dfs(int nod)
{
    viz[nod] = 1;
    for(int i =0 ; i < v[nod].size(); i++)
    {
        if(!viz[v[nod][i].first])
            dfs(v[nod][i].first);
    }
}
int main()
{
    fin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        fin >> a >> b;
        v[a].push_back({b, i});
        v[b].push_back({a, i});
        g[a]++;
        g[b]++;
    }
    for(int i = 1; i <= n; i++)
    if(g[i] != 0)
    {
        dfs(i);
        x = i;
        break;
    }
    for(int i= 1; i <= n; i++)
    {
        if(g[i] != 0)
        {
            if(g[i] % 2 == 1 || viz[i] == 0)
            {
                fout << -1;
                return 0;
            }
        }
    }
    st.push(x);
    while(!st.empty())
    {
        nod = st.top();

        if(g[nod] == 0)
        {
            if(ok == 0)ok = 1;
            else fout << nod << '\n';
            st.pop();
        }
        else
        {
            int i = v[nod].size() - 1;
            while(fol[v[nod][i].second] == 1)
            {
                v[nod].pop_back();
                i--;
            }
            int vecin = v[nod][i].first;
            g[nod]--;
            g[v[nod][i].first]--;
            fol[v[nod][i].second] = 1;
            v[nod].pop_back();
            st.push(vecin);
        }
    }
    return 0;
}