Cod sursa(job #2124880)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 7 februarie 2018 18:10:18
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <stack>
#include <cstdio>
#include <vector>
#define N 100005
#define M 500005

using namespace std;

struct muchie
{
    int x, y;
    bool viz;
}g[M];
int n, m, sol[M];
vector <int> graf[M];
stack <int> drum;

void parcurg()
{
    drum.push(1);
    while(!drum.empty())
    {
        int nod=drum.top();
        if(graf[nod].size())
        {
            int urm=graf[nod].back();
            graf[nod].pop_back();
            if(g[urm].viz==true)
                continue;
            g[urm].viz=true;
            if(g[urm].x==nod)
                drum.push(g[urm].y);
            else
                drum.push(g[urm].x);
        }
        else
        {
            sol[++sol[0]]=drum.top();
            drum.pop();
        }
    }
}

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

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

    scanf("%d %d\n", &n, &m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d\n", &g[i].x, &g[i].y);
        g[i].viz=false;
        graf[g[i].x].push_back(i);
        graf[g[i].y].push_back(i);
    }
    if(!e_euler())
        printf("-1");
    else
    {
        parcurg();
        for(int i=1;i<sol[0];i++)
            printf("%d ", sol[i]);
    }
    return 0;
}