Cod sursa(job #2509347)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 14 decembrie 2019 10:08:02
Problema Ciclu Eulerian Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#define MMAX 500005
#define NMAX 100005
#include <fstream>
#include <vector>
#include <stack>
using namespace std;

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


struct muchie{
    int x, y;
    bool viz = false;
}mu[MMAX];

int n, m;
int gr[NMAX], viz[NMAX], conex, nrg0;
vector<int> graph[NMAX];
stack<int> ciclu;



void read()
{
    f>>n>>m;
    for(int i=1; i<=m; ++i)
    {
        f>>mu[i].x>>mu[i].y;
        graph[mu[i].x].push_back(i);
        graph[mu[i].y].push_back(i);
        gr[mu[i].x] ++;
        gr[mu[i].y] ++;
    }
}


bool grPar()
{
    bool ok = 1;
    for(int i=1; i<=n; ++i)
    {
        if(gr[i]%2 == 1)
            ok = 0;
        if(gr[i] == 0)
            nrg0 ++;
    }
    return ok;
}


void parc(int nod)
{
    viz[nod] = 1;
    conex++;
    for(auto &v:graph[nod])
    {
        int capat = (mu[v].x == nod)?mu[v].y:mu[v].x;
        if(viz[capat] == 0)
            parc(capat);
    }

}







void solve()
{
    parc(1);
    if(!(grPar() == true && conex + nrg0 == n))
    {
        g<<"-1";
        return;
    }

    g<<1<<" ";
    ciclu.push(1);
    while(!ciclu.empty())
    {
        int from = ciclu.top();
        if(!graph[from].empty())
        {
            int last = graph[from].back();
            graph[from].pop_back();
            if(mu[last].viz == false)
            {
                mu[last].viz = true;
                int capat = (mu[last].x == from)?mu[last].y:mu[last].x;
                ciclu.push(capat);
            }
        }
        else{
            if(from != 1)
                g<<from<<" ";
            ciclu.pop();
        }
    }


}



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