Cod sursa(job #2195905)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 17 aprilie 2018 17:30:49
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include <fstream>
#define nmax 100002
#define mmax 500002
using namespace std;
struct graf_neorientat{
    int n,m,Start[nmax+2],grad[nmax+2];
    ///pentru eliminarea muchiilor parcurse
    bool vizm[mmax+2];
    ///pentru pastrarea vecinilor si a etichetei muchiei de care apartin
    struct vecin{int x,pozm,urm;}T[2*mmax+2];
    ///pentru pastrarea nodurilor ciclului
    struct nod{int x,urm;}E[mmax+2];

    void citire(){
        ifstream  fin("ciclueuler.in");
        int i,j,k,r;
        fin>>n>>m;
        for(k=1;k<=n;k++){
            Start[k]=0;grad[k]=0;
        }
        r=0;
        for(k=1;k<=m;k++){
            fin>>i>>j;
            vizm[k]=false; grad[i]++; grad[j]++;
            r++; T[r]={j,k,Start[i]}; Start[i]=r;
            r++; T[r]={i,k,Start[j]}; Start[j]=r;
        }
        fin.close();
    }
    void ciclu_eulerian(){
        ofstream fout("ciclueuler.out");
        int k,r,i,ul,w,p,q;
        E[0]={1,-1};///"ciclul" [1] de lungime 0
        r=0;k=0;
        while(k!=-1 && r<m){
            ///caut pornire pentru un subciclu
            while(grad[E[k].x]){
                ///subciclul incepe cu E[k].x
                ///si se va insera la dreapta lui E[k]
                ul=k;
                w=E[ul].urm; E[ul].urm=-1;
                do{
                    p=E[ul].x;
                    for(i=Start[p];i;i=T[i].urm){
                        q=T[i].x;
                        if(!vizm[T[i].pozm]){
                            ///adaug varful q subciclului
                            r++; E[r]={q,0}; E[ul].urm=r; ul=r;
                            vizm[T[i].pozm]=true;
                            grad[p]--; grad[q]--;
                            Start[p]=T[i].urm;
                            break;
                        }
                    }
                }while(q!=E[k].x);
                E[ul].urm=w;
            }
            k=E[k].urm;
        }
        if(r<m){fout<<-1;return;}
        for(k=0,i=0;i<m;k=E[k].urm,i++){
            fout<<E[k].x<<" ";
        }
        fout.close();
    }
} G;
int main()
{
    G.citire();
    G.ciclu_eulerian();
    return 0;
}