Pagini recente » Cod sursa (job #2203496) | Cod sursa (job #1163381) | Cod sursa (job #884763) | Cod sursa (job #918768) | Cod sursa (job #2377186)
#include <fstream>
#include <unordered_set>
#include <stack>
using namespace std;
struct graph
{
unordered_multiset<int>* adj;
int s;
graph(const int n)
{
adj = new unordered_multiset<int>[n];
s = n;
}
void add_edge(const int u, const int v)
{
adj[u].insert(v);
adj[v].insert(u);
}
};
stack<int> path;
stack<int> st;
void euler_path(graph& g)
{
st.push(0);
while(!st.empty())
{
int u = st.top();
if(g.adj[u].empty())
{
path.push(st.top());
st.pop();
}
else
{
int v = *g.adj[u].begin();
st.push(v);
g.adj[u].erase(g.adj[u].find(v));
g.adj[v].erase(g.adj[v].find(u));
}
}
}
int main()
{
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n, m;
f >> n >> m;
graph gr(n);
for(int i= 0; i < m; i++)
{
int u, v;
f >> u >> v;
u--; v--;
gr.add_edge(u,v);
}
for(int i = 0; i < n; i++)
if(gr.adj[i].size()%2==1)
{
g << -1;
return 0;
}
euler_path(gr);
path.pop();
while(!path.empty())
{
g << path.top()+1 << ' ';
path.pop();
}
return 0;
}