Cod sursa(job #1888350)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 22 februarie 2017 01:55:37
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <vector>
#include <cstdio>
#include <stack>

#define NMAX 100005
#define MMAX 500005

using namespace std;

struct muchie
{
    int nod1,nod2;
}muchii[MMAX];

int N,M;
vector<int> graf[NMAX];

void citire()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d",&muchii[i].nod1,&muchii[i].nod2);
        graf[muchii[i].nod1].push_back(i);
        graf[muchii[i].nod2].push_back(i);
    }
}

bool grade()
{
    for(int i=1;i<=N;i++)
        if(graf[i].size()%2==1)
            return 0;
    return 1;
}

stack<int> s;
int used[MMAX];
vector<int> rez;
void euler()
{
    s.push(1);
    while(!s.empty())
    {
        int nod_curent = s.top();
        if(graf[nod_curent].size())
        {
            int muchie_noua = graf[nod_curent].back();
            graf[nod_curent].pop_back();

            if(used[muchie_noua])
                continue;

            if(muchii[muchie_noua].nod1 == nod_curent)
                s.push(muchii[muchie_noua].nod2);
            else
                s.push(muchii[muchie_noua].nod1);

            used[muchie_noua]=1;
        }
        else
        {
            rez.push_back(s.top());
            s.pop();
        }
    }
}

void afisare()
{
    for(vector<int>::iterator ii=rez.begin();ii!=rez.end()-1;ii++)
        printf("%d ",*ii);
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    citire();

    if(grade())
    {
        euler();
        afisare();
    }
    else
        printf("-1");
    return 0;
}