Cod sursa(job #1846473)

Utilizator AcuasPopescu Nicolae-Aurelian Acuas Data 12 ianuarie 2017 21:44:38
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.57 kb
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,v[NMAX],st[10000000],k,muchii,m;
struct nod{
    int info;
    nod* urm;
}*G[NMAX];
nod* inserare_inceput(nod* p,int x){
    nod* elem=new nod;
    elem->info=x;
    if(p==NULL){
        elem->urm=NULL;
        return elem;
    }
    elem->urm=p;
    return elem;
}
void sterge(nod* predecesor){
    nod* deSters=predecesor->urm;
    predecesor->urm=predecesor->urm->urm;
    delete deSters;
}
int main(){
    f>>n>>m;
    int i,j;
    while(f>>i>>j){
        v[i]++;
        v[j]++;
        G[i]=inserare_inceput(G[i],j);
        G[j]=inserare_inceput(G[j],i);
    }
    for(i=1;i<=n;i++)
    if(v[i]%2!=0){
        g<<-1<<'\n';
        return 0;
    }
    st[++k]=1;
    nod* parcurg;
    while(k){
        int nod=st[k];
        if(v[nod]==0){
            ++muchii;
            g<<nod<<' ';
            st[k]=0;
            k--;
            if(muchii>=m)
                break;
        }
        else{
            int u;
            if(v[nod]>=2){
                v[nod]--;
                parcurg=G[nod];
                while(parcurg->urm->urm)
                    parcurg=parcurg->urm;
                u=parcurg->urm->info;
                st[++k]=u;
                sterge(parcurg);
                if(v[u]>=2){
                    parcurg=G[u];
                    if(parcurg->info==nod){
                        G[u]=G[u]->urm;
                        delete parcurg;
                    }else{
                        while(parcurg->urm->info!=nod)
                            parcurg=parcurg->urm;
                        sterge(parcurg);
                    }
                }else if(v[u]==1){
                    delete G[u];
                }
                v[u]--;
            }
            else if(v[nod]==1){
                v[nod]--;
                u=G[nod]->info;
                st[++k]=u;
                delete G[nod];
                if(v[u]>=2){
                    parcurg=G[u];
                    if(parcurg->info==nod){
                        G[u]=G[u]->urm;
                        delete parcurg;
                    }else{
                        while(parcurg->urm->info!=nod)
                            parcurg=parcurg->urm;
                        sterge(parcurg);
                    }
                }else if(v[u]==1){
                    delete G[u];
                }
                v[u]--;
            }
        }
    }
    return 0;
}