Cod sursa(job #2509420)

Utilizator AndreiGSGhiurtu Andrei AndreiGS Data 14 decembrie 2019 10:56:20
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>

using namespace std;

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

struct pereche {
    int x, y, viz;
} muchii[500005];

vector<int> graph[500005];
stack<int> s;
int grade[500005];
int vizParcurgere[500005], nrCompConexe;
int n, m;

void citire()
{
    int x, y;
    f>>n>>m;
    for(int i=1; i<=m; i++)
    {
        f>>x>>y;
        muchii[i].x=x;
        muchii[i].y=y;
        muchii[i].viz=0;
        graph[x].push_back(i);
        graph[y].push_back(i);
        grade[x]++;
        grade[y]++;
    }
}

int verificareEulerian()
{
    for(int i=1; i<=n; i++)
        if(grade[i]%2!=0)
            return 0;
    return 1;
}

/*void vfIzolate()
{
    for(int i=0; i<n; i++)
        if(grade[i]==0)
            vizParcurgere[i]=1;
}*/

void parcurgGraf()
{
    while(!s.empty())
    {
        int x=s.top();
        if(graph[x].empty())
        {
            s.pop();
            if(!s.empty())
                g<<x<<' ';
            continue;
        }
        int y=graph[x].back();
        graph[x].pop_back();
        if(muchii[y].viz)
            continue;
        muchii[y].viz=1;
        if(x==muchii[y].x)
            s.push(muchii[y].y);
        else
            s.push(muchii[y].x);
    }
}

int main()
{
    citire();
    if(verificareEulerian()==0)
        g<<"-1";
    else
    {
        s.push(1);
        parcurgGraf();
    }

    return 0;
}