#include #include #include typedef int Node; typedef std::vector> List; void dfs(List& neighbours, std::vector& visited, Node u) { visited[u] = true; for (Node v : neighbours[u]) { if (!visited[v]) { dfs(neighbours, visited, v); } } } void erase_edge(List& neighbours, Node u, Node v) { neighbours[u].erase(find(neighbours[u].begin(), neighbours[u].end(), v)); neighbours[v].erase(find(neighbours[v].begin(), neighbours[v].end(), u)); } bool is_valid(List& neighbours, int u, int v) { // Ako je (u,v) jedina grana uzimamo nju if (neighbours[u].size() == 1) { return true; } // Ako ne posotji grane if (neighbours[u].empty() || neighbours[v].empty()) { return false; } std::vector visited(neighbours.size(), false); erase_edge(neighbours, u, v); dfs(neighbours, visited, u); neighbours[u].push_back(v); neighbours[v].push_back(u); if (visited[v]) { return true; } return false; } void fleury(List& neighbours, std::vector& euler, int u) { for (int v : neighbours[u]) { if (is_valid(neighbours, u, v)) { euler.push_back(v); erase_edge(neighbours, u, v); fleury(neighbours, euler, v); } } } void print_euler(List& neighbours) { int num_odd = 0; int odd = 0; for (Node u = 0; u < neighbours.size(); u++) { if (neighbours[u].size() % 2 != 0) { num_odd++; odd = u; } } if (num_odd != 0 && num_odd != 2) { std::cout << "Ne postoji Ojler" << std::endl; return; } std::vector euler; if (num_odd == 2) { euler.push_back(odd); fleury(neighbours, euler, odd); } else { euler.push_back(0); fleury(neighbours, euler, 0); } for (Node u : euler) { std::cout << u << " "; } std::cout << std::endl; } int main(void) { List neighbours = { {1, 2}, {0, 2}, {0, 1, 3}, {2} }; print_euler(neighbours); return 0; }