Cod sursa(job #2509350)

Utilizator Vladv01Vlad Vladut Vladv01 Data 14 decembrie 2019 10:10:57
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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


struct noduri{

    int x,y,viz;

}nod[500005];

stack   <int> st;
vector <int> gr[100005];
int n,m,k,grd[100005];


void cit()
{
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        f>>x>>y;
        gr[x].push_back(k);
        gr[y].push_back(k);
        nod[k++]={x,y,0};
        grd[x]++;
        grd[y]++;
    }
}

int euler()
{
   for(int i=1;i<=n;i++)
        if(grd[i]%2==1 || grd[i]==0)
         return 0;
   return 1;
}

void rezolv()
{
    st.push(1);
    while(!st.empty())
    {
        int nd=st.top();
        if (gr[nd].size()==0) {
            st.pop();
            if (!st.empty())
                g<<nd<<' ';
            continue;
        }
        int last=gr[nd].back();
        int from=nod[last].x,to=nod[last].y;
        int viz=nod[last].viz;
        gr[nd].pop_back();
        if (viz==1)
            continue;
        if (from!=nd)
            swap(from,to);
        st.push(to);
        nod[last].viz=1;
    }
}

int main()
{
    cit();
    if(euler()==0)
    {
        g<<-1;
        return 0;
    }
    rezolv();


    return 0;
}