Cod sursa(job #1451391)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 16 iunie 2015 21:53:50
Problema Ciclu Eulerian Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#define MAXN 100000
#define MAXM 500000
FILE *fin, *fout;
int folosit[MAXM], val[2*MAXN], next[2*MAXM], lista[MAXN+1], stiva[MAXM+1], nr[MAXN+1], k;
inline void adauga(int x, int y){
    val[++k]=y;
    next[k]=lista[x];
    lista[x]=k;
    nr[x]++;
}
inline void euler(int nod){
    int vf;
    stiva[0]=nod;
    vf=0;
    while(vf>=0){
        if(lista[stiva[vf]]==0){
            fprintf(fout, "%d ", stiva[vf]);
            vf--;
        }else if(folosit[(lista[stiva[vf]]-1)/2]==1){
            lista[stiva[vf]]=next[lista[stiva[vf]]];
        }else{
            folosit[(lista[stiva[vf]]-1)/2]=1;
            vf++;
            stiva[vf]=val[lista[stiva[vf-1]]];
            lista[stiva[vf-1]]=next[lista[stiva[vf-1]]];
        }
    }
}
int main(){
    int n, m, i, a, b, f, start;
    fin=fopen("ciclueuler.in", "r");
    fout=fopen("ciclueuler.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for(i=0; i<m; i++){
        fscanf(fin, "%d%d", &a, &b);
        adauga(a, b);
        adauga(b, a);
    }
    f=1;
    for(i=1; i<=n; i++){
        if(nr[i]%2==1){
            f=0;
        }
        if(nr[i]>0){
            start=i;
        }
    }
    if(f==0){
        fprintf(fout, "-1\n");
    }else{
        euler(start);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}