Cod sursa(job #1870278)

Utilizator Coroian_DavidCoroian David Coroian_David Data 6 februarie 2017 15:39:51
Problema Ciclu Eulerian Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <cstdio>

using namespace std;

FILE *f, *g;

int n, m;

int k;

int rez;
int v[100001];

int lst[100001];
int nd[100001];

int urm[1000001];
int ant[1000001];
int nod[1000001];

void add(int a, int b)
{
    k ++;

    nod[k] = b;
    urm[k] = lst[a];

    ant[lst[a]] = k;
    lst[a] = k;

    nd[a] ++;
}

void readFile()
{
    f = fopen("ciclueuler.in", "r");

    fscanf(f, "%d%d", &n, &m);

    int i;
    int a, b;
    for(i = 1; i <= m; i ++)
    {
        fscanf(f, "%d%d", &a, &b);

        add(a, b);
        add(b, a);
    }

    fclose(f);
}

int primulNod(int x)
{
    int rez = 0, p;

    nd[x] --;

    for(p = lst[x]; p != 0 && (rez == 0); p = urm[p])
    {
        if(nod[p] != -1)
        {
            rez = nod[p];

            nod[p] = -1;
        }
    }

    return rez;
}

void sterge(int a, int b)
{
    int p;

    nd[a] --;

    for(p = lst[a]; p != 0; p = urm[p])
    {
        if(nod[p] == b)
        {
            nod[p] = -1;

            return;
        }
    }
}

int stk[1000001];

void solve()
{
    int i;
    for(i = 1; i <= n && (rez != -1); i ++)
    {
        if(nd[i] % 2 == 1 || nd[i] == 0)
            rez = -1;
    }

    int x, y;

    if(rez == 0)
    {
        int stkLen = 0;

        stk[++ stkLen] = 1;

        while(stkLen > 0)
        {
            x = stk[stkLen];

            while(nd[x] > 0)
            {
                y = primulNod(x);

                sterge(y, x);

                stk[++ stkLen] = y;

                x = y;
            }

            v[++ rez] = stk[stkLen --];
        }
    }
}

void printFile()
{
    g = fopen("ciclueuler.out", "w");

    if(rez == -1)
        fprintf(g, "%d\n", rez);

    else
    {
        int i;
        for(i = rez; i >= 1; i --)
            fprintf(g, "%d ", v[i]);

        fprintf(g, "\n");
    }

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}