Cod sursa(job #1575729)

Utilizator vnedelcuVictor Andrei Nedelcu vnedelcu Data 21 ianuarie 2016 19:40:17
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <stdio.h>
const int nmax=100001;
const int mmax=500001;
const int NIL=-1;

int head[nmax];
int gr[nmax];
int st[mmax+2];
int sz;

struct element
{
    int nod,pereche,next;
};

element buff[2*mmax];

void push(int n1, int n2, int pos, int pereche)
{
    buff[pos].nod=n2;
    buff[pos].pereche=pereche;
    buff[pos].next=head[n1];
    head[n1]=pos;
}

void euler(int nod, FILE *f)
{
    st[++sz]=nod;///pun nodul cu care incep in stiva
    while (sz)///stiva nevida
    {
        nod=st[sz];///extrag elementul din varf
        while ((head[nod] != NIL) && (buff[head[nod]].nod == NIL))///nodul are muchii netraversate si am marcat anumite muchii
            head[nod]=buff[head[nod]].next;///sar peste muchiile marcate
        if (head[nod] != NIL)///nodul are muchii netraversate
        {
            st[++sz]=buff[head[nod]].nod;///iau vecinul nodului (cu care acesta formeaza muchii)
            buff[buff[head[nod]].pereche].nod=NIL;///marchez ca am traversat vecinul
            head[nod]=buff[head[nod]].next;///trec la urmatorul vecin
        }
        else
        {
            sz--;///sterg ultimul element din stiva
            if (sz)///stiva nevida
                fprintf(f,"%d ",nod);///afisez
        }
    }
}

int main()
{
    FILE *f;
    int n,m,i,x,y;
    bool ok;

    f=fopen("ciclueuler.in","r");
    fscanf(f,"%d%d",&n,&m);
    for (i=1; i<=n; i++)
        head[i]=NIL;

    for (i=1; i<=m; i++)
    {
        fscanf(f,"%d%d",&x,&y);
        gr[x]++;
        push(x,y,2*i-1,2*i);
        gr[y]++;
        push(y,x,2*i,2*i-1);
    }
    fclose(f);

    f=fopen("ciclueuler.out","w");
    ok=true;
    for (i=1; i<=n; i++)///nu exista ciclu
        if (gr[i] % 2)
            ok=false;
    if (!ok)
        fprintf(f,"-1");
    else
        euler(buff[1].nod,f);
    fclose(f);
}