Cod sursa(job #2383790)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 19 martie 2019 19:49:35
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <bits/stdc++.h>
#define LIM 1<<17
/// TONI BO$$ was here
/// #MLC

using namespace std;
char BUF[LIM];
int poz;

inline char getChar(){
    poz++;
    if(poz>=LIM){
    	fread(BUF,LIM,1,stdin);
    	poz=0;
    }
    return BUF[poz];
}

inline int getNr(){
    int r=0, semn=1;
    char ch=getChar();
    while(isdigit(ch)==0 && ch!='-') ch=getChar();
    if(ch=='-'){
        semn=-1;
        ch=getChar();
    }
    while(isdigit(ch)!=0){
        r=r*10+semn*(ch-'0');
        ch=getChar();
    }
    return r;
}

list <int> G[100001];
map <int,int> mapa[100001];
stack < int , vector <int> > steve;
stack < int , vector <int> > rez;
list <int> :: iterator it;
list <int> :: iterator it2;

int gr[100001];

int main()
{
    int n,m,i,x,y;
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    poz=LIM;
    n=getNr();
    m=getNr();
    for(i=1; i<=m; i++)
    {
        x=getNr();
        y=getNr();
        gr[x]++;
        gr[y]++;
        G[x].emplace_back(y);
        G[y].emplace_back(x);
        mapa[x][y]++;
        mapa[y][x]++;
    }
    for(i=1; i<=n; i++)
        if(gr[i]%2)
        {
            printf("-1");
            return 0;
        }
    steve.push(1);
    while(!steve.empty())
    {
        int z=steve.top();
        if(!gr[z])
        {
            steve.pop();
            if(!steve.empty())
                printf("%d ",z);
            continue ;
        }
        it=G[z].begin();
        steve.push(*it);
        gr[*it]--;
        gr[z]--;
        if(*it!=z)
        {
            mapa[z][*it]--;
            mapa[*it][z]--;
            if(!mapa[*it][z])
                G[*it].remove(z);
            if(!mapa[z][*it])
                G[z].remove(*it);
        }
        else
        {
            mapa[z][z]-=2;
            if(!mapa[z][z])
                G[z].remove(z);
        }
    }

    return 0;
}