Cod sursa(job #1712448)

Utilizator MaarcellKurt Godel Maarcell Data 2 iunie 2016 21:25:44
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

struct edge{
    int d,ind;
};

int N,M,cnt,K,ans[500100],cr[500100]; vector<edge> g[100100]; bool v[100100],ve[500100];

void dfs(int nod){
    if (v[nod]) return;
    cnt++,v[nod]=1;

    for (int i=0; i<g[nod].size(); i++)
        dfs(g[nod][i].d);
}

void euler(int nod){
    ans[++K]=nod;

    while (1){
    while (cr[nod]<g[nod].size())
        if (!ve[g[nod][cr[nod]].ind]) break;
        else cr[nod]++;

        if (cr[nod]>=g[nod].size()) break;

        ve[g[nod][cr[nod]].ind]=1;
        euler(g[nod][cr[nod]].d);
    }
}

int main(){
    ifstream fin("ciclueuler.in");
    ofstream fout("ciclueuler.out");
    fin >> N >> M;

    int i,x,y; edge aux;
    for (i=1; i<=M; i++){
        fin >> x >> y;
        aux.ind=i;
        aux.d=y;
        g[x].push_back(aux);
        aux.d=x;
        g[y].push_back(aux);
    }

    bool b=1;
    for (i=1; i<=N; i++)
        if (g[i].size()%2==1) b=0;

    dfs(1);
    if (cnt<N) b=0;

    if (!b){
        fout << -1 << "\n";
        return 0;
    }

    euler(1);
    for (i=1; i<K; i++) fout << ans[i] << " ";
    fout << "\n";

    return 0;
}