Cod sursa(job #1870241)

Utilizator Coroian_DavidCoroian David Coroian_David Data 6 februarie 2017 15:15:01
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 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);

        if(a != b)
            add(b, a);
    }

    fclose(f);
}

int primulNod(int x)
{
    int rez = lst[x];

    lst[x] = urm[lst[x]];

    nd[x] --;

    return nod[rez];
}

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

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

                nd[a] --;

                return;
            }

            else
            {
                urm[ant[p]] = urm[p];

                nd[a] --;

                return;
            }
        }
    }
}

int c[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 st = 1, dr = 0;

        c[++ dr] = 1;

        while(st <= dr)
        {
            x = c[st];

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

                sterge(y, x);

                c[++ dr] = y;

                x = y;
            }

            v[++ rez] = c[st];

            st ++;
        }
    }
}

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

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

    else
    {
        int i;
        for(i = 1; i <= rez; i ++)
            fprintf(g, "%d\n", v[i]);

        fprintf(g, "\n");
    }

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}