Cod sursa(job #2716054)

Utilizator GligarEsterabadeyan Hadi Gligar Data 4 martie 2021 17:26:18
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>
#include <vector>

using namespace std;

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

struct str{
    int x,y;
};

const int nmax=100000, mmax=500000;

int t[nmax+1], m;

bool viz[nmax+1], mviz[mmax+1];

vector <str> g[nmax+1];

void ad(int nod){
    viz[nod]=1;
    for(int i=0;i<int(g[nod].size());i++){
        int vecin=g[nod][i].x;
        if(viz[vecin]==0){
            t[vecin]=g[nod][i].y;
            ad(vecin);
        }
    }
}

int k;
void euler(int nod){
    k++;
    if(k<=m){
        fout<<nod<<" ";
    }
    for(int i=0;i<int(g[nod].size());i++){
        int vecin=g[nod][i].x;
        int muchie=g[nod][i].y;
        if(mviz[muchie]==0){
            if(t[nod]!=muchie&&t[vecin]!=muchie){
                mviz[muchie]=1;
                g[nod][i]=g[nod][g[nod].size()-1];
                g[nod].pop_back();
                euler(vecin);
            }
        }else{
            g[nod][i]=g[nod][g[nod].size()-1];
            g[nod].pop_back();
            --i;
        }
    }
    for(int i=0;i<int(g[nod].size());i++){
        int vecin=g[nod][i].x;
        int muchie=g[nod][i].y;
        if(mviz[muchie]==0){
            mviz[muchie]=1;
            g[nod][i]=g[nod][g[nod].size()-1];
            g[nod].pop_back();
            euler(vecin);
        }else{
            g[nod][i]=g[nod][g[nod].size()-1];
            g[nod].pop_back();
            --i;
        }
    }
}

int main(){
    int n;
    fin>>n>>m;
    for(int i=1;i<=m;i++){
        str aux;
        int x,y;
        fin>>x>>y;
        aux.x=y;
        aux.y=i;
        g[x].push_back(aux);
        aux.x=x;
        g[y].push_back(aux);
    }
    int ok=1;
    ad(1);
    for(int i=1;i<=n;i++){
        if(viz[i]==0||g[i].size()%2==1){
            ok=0;
        }
    }
    if(ok==1){
        euler(1);
        fout<<"\n";
    }else{
        fout<<-1<<"\n";
    }
}