Cod sursa(job #2663773)

Utilizator modulopaulModulopaul modulopaul Data 27 octombrie 2020 11:40:31
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
#define MAXN 100001
#define MAXM 500001

using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

int n,m;

struct nod{
    int dest;
    nod *urm;
};
nod *MC[MAXM];

void add(int x,int y){
    if(MC[x]==NULL){
        MC[x]=new nod;
        MC[x]->dest=y;
        MC[x]->urm=NULL;
    }
    else{
        nod *q=new nod;
        q->dest=y;
        q->urm=MC[x];
        MC[x]=q;
    }
}

void close(int x,int y){
    nod *i=new nod;
    if(MC[x]->dest==y){
        MC[x]=MC[x]->urm;
        return;
    }
    i=MC[x];
    for(;i->urm!=NULL;i=i->urm){
        if(i->urm->dest==y){
            i->urm=i->urm->urm;
            return;
        }
    }
    if(i->dest==y)
        i=NULL;
}

void afis(){
    for(int i=1;i<=n;i++){
        nod *j=new nod;
        for(j=MC[i];j!=NULL;j=j->urm){
            fout<<i<<' '<<j->dest<<'\n';
        }
        fout<<"*\n";
    }
}
queue <int> myq;
stack <int> myst;

int grad[MAXN],nrgoodgrad;

int main(){
    fin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y;
        fin>>x>>y;
        grad[x]++;
        if(grad[x]%2==0) nrgoodgrad++;
        else nrgoodgrad--;
        grad[y]++;
        if(grad[y]%2==0) nrgoodgrad++;
        else nrgoodgrad--;
        add(x,y); add(y,x);
    }

    if(nrgoodgrad!=0){
        fout<<-1;
        return 0;
    }

    myst.push(1);
    while(!myst.empty()){
        int nod=myst.top();
        if(MC[nod]!=NULL){
            myst.push(MC[nod]->dest);
            close(MC[nod]->dest,nod);
            MC[nod]=MC[nod]->urm;
        }
        else{
            myst.pop();
            myq.push(nod);
        }
    }

    while(myq.size()>1){
        fout<<myq.front()<<' ';
        myq.pop();
    }
    return 0;
}