Cod sursa(job #369064)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 26 noiembrie 2009 23:06:55
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
# include <cstdio>
# include <string>
# include <algorithm>

using namespace std;

# define FIN "ciclueuler.in"
# define FOUT "ciclueuler.out"

# define MAX_L 20
# define MAX_N 100005
# define MAX_M 500005

struct List
{
    int inf, ind;
    List *next;
} *p, *G[MAX_N];

int N, M, i, ct;
int dg[MAX_M];

char s[MAX_L];
int Sol[MAX_M]; 
int Stack[MAX_M];

    void del_used_edge(List *&f)
    {
        List *q;

        while (f)
        {
            if (!dg[f -> ind]) return;

            q = f;
            f = f -> next;
            delete(q);
        }
    }

    void euler()
    {
        List *q;
        int Nod, vf, newNod;

        Stack[vf = 1] = Nod = 1;
        while (vf)
        {
            del_used_edge(G[Nod]);

            if (G[Nod])
            {
                newNod = G[Nod] -> inf;
                dg[G[Nod] -> ind] = 1;
                Stack[++vf] = newNod;

                q = G[Nod];
                G[Nod] = G[Nod] -> next;
                delete(q);

                Nod = newNod;
            } else
            {
                Nod = Stack[vf];

                del_used_edge(G[Nod]);
                if (!G[Nod])
                {
                    --vf;
                    Sol[++ct] = Nod;
                }
            }
        }
    }

    int main()
    {
        freopen(FIN, "r", stdin);
        freopen(FOUT, "w", stdout);

        scanf("%d%d\n", &N, &M);

        int a, b, j;
        for (i = 1; i <= M; ++i)
        {
            a = b = 0;
            fgets(s + 1, MAX_L, stdin);
            for (j = 1; s[j] != ' '; ++j) a = a * 10 + s[j] - '0';
            for (++j; s[j] != '\n'; ++j) b = b * 10 + s[j] - '0';

            ++dg[a]; ++dg[b];

            p = new List;
            p -> inf = b; p -> ind = i; p -> next = G[a]; G[a] = p;

            p = new List;
            p -> inf = a; p -> ind = i; p -> next = G[b]; G[b] = p;
        }

        for (i = 1; i <= N; ++i)
            if ((dg[i] & 1)) { printf("-1"); return 0; }

        memset(dg, 0, sizeof(dg));

        euler();

        memset(dg, 0, sizeof(dg));
        for (i = 1; i <= ct; ++i) dg[Sol[i]] = 1;
        for (i = 1; i <= N; ++i)
           if (!dg[i]) { printf("-1"); return 0; }

        for (i = 1; i < ct; ++i) printf("%d ", Sol[i]);

        return 0;
    }