Pagini recente » Cod sursa (job #2779485) | Cod sursa (job #2372433) | Cod sursa (job #1125685) | Cod sursa (job #3218599) | Cod sursa (job #1471948)
#include <vector>
#include <list>
#include <stack>
#include <fstream>
#include <algorithm>
using namespace std;
class graf{
vector<list<int> > adiac;
public:
graf(const int n):
adiac(n){}
void add_muc(const int a, const int b){
adiac[a].push_back(b);
adiac[b].push_back(a); }
void rm_muc(const int a, const int b){
adiac[a].erase(find(begin(adiac[a]), end(adiac[a]), b));
adiac[b].erase(find(begin(adiac[b]), end(adiac[b]), a)); }
bool e_eulerian(){
return all_of(begin(adiac), end(adiac), [](const list<int>& ls){
return ls.size() % 2 == 0; }); }
vector<int> fa_ciclu_euler(){
vector<int> rez;
stack<int> st;
st.push(distance(
begin(adiac),
find_if(begin(adiac), end(adiac), [](const list<int>& ls){
return !ls.empty(); })));
while(!st.empty()){
const int cur = st.top();
if(!adiac[cur].empty()){
const int next = adiac[cur].front();
st.push(next);
rm_muc(cur, next); }
else{
st.pop();
rez.push_back(cur); } }
return rez; } };
int main(){
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n, m;
f >> n >> m;
graf gr(n);
for(int i = 0, a, b; i < m; ++i){
f >> a >> b;
gr.add_muc(a-1, b-1); }
if(gr.e_eulerian()){
auto ciclu = gr.fa_ciclu_euler();
ciclu.pop_back();
for(const auto x : ciclu){
g << x+1 << ' '; } }
else{
g << "-1"; }
return 0; }