Cod sursa(job #2119036)

Utilizator catalinlupCatalin Lupau catalinlup Data 31 ianuarie 2018 16:02:20
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <bits/stdc++.h>
#define INFILE "ciclueuler.in"
#define OUTFILE "ciclueuler.out"
using namespace std;

ifstream in(INFILE);
ofstream out(OUTFILE);

int N,M;

struct Graph{
    int n;
    vector<vector<int>> Adj;
    void Init(int sz){
        n=sz;
        Adj.resize(n+1);
    }
    void Add(int x,int y){
        Adj[x].push_back(y);
        Adj[y].push_back(x);
    }
}Gr;

void Hierholzer(Graph& G){
    map<int,int> edgeCount;
    for(int i=0;i<=G.n;i++)
        edgeCount[i]=G.Adj[i].size();
    stack<int> drumPartial;
    vector<int> euler;
    drumPartial.push(1);
    int x=1;
    while(!drumPartial.empty()){
        if(edgeCount[x]>0){
            int y=G.Adj[x].back();
            G.Adj[x].pop_back();
            for(int i=0;i<G.Adj[y].size();i++)
                if(G.Adj[y][i]==x)
                    G.Adj[y].erase(G.Adj[y].begin()+i);
            edgeCount[x]--;
            edgeCount[y]--;
            drumPartial.push(x);
            x=y;
        }
        else{
            euler.push_back(x);
            x=drumPartial.top();
            drumPartial.pop();
        }
    }
    for(int i=0;i<euler.size()-1;i++)
        out<<euler[i]<<" ";

}

void Read(){
    in>>N>>M;
    Gr.Init(N);
    for(int i=1;i<=M;i++){
        int x,y;
        in>>x>>y;
        Gr.Add(x,y);
    }
}

int main()
{
    Read();
    Hierholzer(Gr);
    return 0;
}