Cod sursa(job #1815768)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 25 noiembrie 2016 19:06:50
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <stack>

#define NMAX 100005
#define MMAX 500005
using namespace std;
int N,M;
vector<int> graf[NMAX];
vector<int> ciclu;
struct muchie
{
    int nod1,nod2;
    bool used=0;
} v[MMAX];

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);
    }
    for(int i=1; i<=N; i++)
    {
        if(graf[i].size()%2==1)
        {
            cout<<-1;
            exit(0);
        }
    }
}

stack<int> q;
void rezolvare()
{
    q.push(1);
    while(!q.empty())
    {
        int c = q.top();
        if(graf[c].size())
        {
            int x,i=graf[c].back();
            graf[c].pop_back();
            if(v[i].used == 0)
            {
                if(v[i].nod1==c)
                    x = v[i].nod2;
                else
                    x = v[i].nod1;

                v[i].used = 1;
                q.push(x);
            }
        }
        else
        {
            ciclu.push_back(c);
            q.pop();
        }
    }
}

void afisare()
{
    for(vector<int>::iterator ii = ciclu.begin(); ii!= ciclu.end(); ii++)
    {
        printf("%d ",*ii);
    }
}
int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    citire();
    rezolvare();
    afisare();

    return 0;
}