Cod sursa(job #1815948)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 25 noiembrie 2016 22:52:24
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>

#define NMAX 100005
#define MMAX 500005

using namespace std;

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

struct muchie
{
    int nod1,nod2;
    bool used=0;
} v[NMAX];

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

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

void rezolvare()
{
    s.push(1);
    while(!s.empty())
    {
        int c = s.top();
        if(graf[c].size())
        {
            int x,i=graf[c].back();
            graf[c].pop_back();
            if(v[i].used == 0)
            {
                v[i].used = 1;
                if(c == v[i].nod1)
                    x = v[i].nod2;
                else
                    x = v[i].nod1;
                s.push(x);
            }
        }
        else
        {
            rez.push_back(c);
            s.pop();
        }
    }
}

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

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    citire();
    if(verificare_grad())
        return 0;
    rezolvare();
    afisare();
    return 0;
}