Pagini recente » Cod sursa (job #3253966) | Cod sursa (job #1254293) | Cod sursa (job #1267402) | Cod sursa (job #1092771) | Cod sursa (job #2119036)
#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;
}