Cod sursa(job #1325820)

Utilizator retrogradLucian Bicsi retrograd Data 24 ianuarie 2015 13:24:39
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<fstream>
#include<deque>
#include<stack>
#include<vector>

#define MAXN 100001
#define MAXM 500001

using namespace std;
typedef int var;

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

struct Edge {
    var n, i;
    Edge(var a, var b) {
        n = a;
        i = b;
    }
};

deque<Edge> G[MAXN];
var PARENT[MAXN];
var D[MAXN];
bool VIZ[MAXN];
bool T[MAXM];
var n;

void dfs(var node) {
    VIZ[node] = 1;
    for(deque<Edge>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
        Edge &e = *it;
        if(!VIZ[e.n]) {
            PARENT[e.n] = node;
            T[e.i] = 1;
            dfs(e.n);
        }
    }
}


int main() {
    var m, a, b;
    stack<var> ST;
    fin>>n>>m;
    for(var i=1; i<=m; i++) {
        fin>>a>>b;
        G[a].push_back(Edge(b, i));
        G[b].push_back(Edge(a, i));
        D[a]++;
        D[b]++;
    }
    dfs(1); //SCOATEM ARBORELE DE REVENIRE
    for(var i=1; i<=n; i++) {
        if( D[i] % 2 || !VIZ[i]) {
            fout<<-1;
            return 0;
        }
    }
    ST.push(1);
    while(ST.top() != 0) {
        var node = ST.top();
        ST.pop();
        while(T[G[node].front().i]) {
            G[node].pop_front(); //SCOATEM VECINII CARE SUNT BAGATI PRIN MUCHII LUATE
        }
        if(G[node].empty()) {
            ST.push(PARENT[node]); //MERGEM PE ARBORELE DE REVENIRE
        } else {
            ST.push(G[node].front().n); //ADAUGAM VECINUL
            T[G[node].front().i] = 1; //AM LUAT MUCHIA
            G[node].pop_front();
        }
        if(ST.top()) fout<<ST.top()<<" ";
    }
    return 0;
}