Cod sursa(job #1855715)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 23 ianuarie 2017 21:11:03
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <algorithm>
#include <vector>

#define pii pair <int, int>
#define f first
#define s second

using namespace std;

vector <int> v[100010];
int grad[100010], st[500010], rez[500010];
bool ap[500010];
pii edge[500010];

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

    int n, m;
    scanf ("%d %d", &n, &m);

    for (int i = 1; i <= m; ++i)
    {
        int x, y;
        scanf ("%d %d", &x, &y);

        ++grad[x];
        ++grad[y];

        v[x].push_back (i);
        v[y].push_back (i);

        edge[i] = pii (x, y);
    }

    for (int i = 1; i <= n; ++i)
        if (grad[i] & 1)
        {
            printf ("-1\n");
            return 0;
        }

    int k = 0;
    st[++k] = 1;

    for (; k > 0;)
    {
        int nod = st[k];

        //printf ("%d %d\n", k, nod);
        if (!v[nod].size ())
        {
            rez[++rez[0]] = st[k--];
            continue;
        }

        int x = v[nod].back ();
        v[nod].pop_back ();

       // printf ("%d %d %d\n", x, edge[x].f, edge[x].s);

        if (ap[x]) continue;
        ap[x] = true;

        st[++k] = ((edge[x].f == nod) ? edge[x].s : edge[x].f);
    }

    for (int i = 1; i < rez[0]; ++i)
        printf ("%d ", rez[i]);

    printf ("\n");

    return 0;
}