Cod sursa(job #1712461)

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

struct edge{
    int d,ind;
};

int N,M,cnt,K,ans[500100],cr[500100],st[500100],T; 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;
    T=1,st[1]=1;

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

            if (cr[nod]<g[nod].size()){
                ve[g[nod][cr[nod]].ind]=1;
                st[++T]=g[nod][cr[nod]].d;
            }
            else{
                ans[++K]=nod;
                T--;
            }
        }
}
//1 6 5 2 3 3 4 1 2 3 2 3

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();
    for (i=1; i<K; i++) fout << ans[i] << " ";
    fout << "\n";

    return 0;
}