Эйлеров цикл. Эйлеров путь: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) Нет описания правки |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 1: | Строка 1: | ||
void | == Рекурсивная реализация == | ||
void eulerRec(vector<multiset<int>> &graph, int v, vector<int> &cycle) { | |||
while (!graph[v].empty()) { | while (!graph[v].empty()) { | ||
int to = *graph[v].begin(); | int to = *graph[v].begin(); | ||
graph[v].erase(graph[v].find(to)); | graph[v].erase(graph[v].find(to)); | ||
graph[to].erase(graph[to].find(v)); | //graph[to].erase(graph[to].find(v)); | ||
eulerRec(graph, to, cycle); | |||
} | } | ||
cycle.push_back(v); | cycle.push_back(v); | ||
} | |||
vector<int> euler(vector<multiset<int>> &graph) { | |||
vector<int> cycle; | |||
eulerRec(graph, 0, cycle); | |||
reverse(cycle.begin(), cycle.end()); | |||
return cycle; | |||
} | |||
== Итеративная реализация == | |||
vector<int> euler(vector<multiset<int>> &graph) { | |||
vector<int> stack = { 0 }, cycle; | |||
while (!stack.empty()) { | |||
int v = stack.back(); | |||
if (!graph[v].empty()) { | |||
int to = *graph[v].begin(); | |||
graph[v].erase(graph[v].find(to)); | |||
//graph[to].erase(graph[to].find(v)); | |||
stack.push_back(to); | |||
} else { | |||
stack.pop_back(); | |||
cycle.push_back(v); | |||
} | |||
} | |||
reverse(cycle.begin(), cycle.end()); | |||
return cycle; | |||
} | } | ||
Текущая версия от 21:32, 19 июня 2021
Рекурсивная реализация
void eulerRec(vector<multiset<int>> &graph, int v, vector<int> &cycle) { while (!graph[v].empty()) { int to = *graph[v].begin(); graph[v].erase(graph[v].find(to)); //graph[to].erase(graph[to].find(v)); eulerRec(graph, to, cycle); } cycle.push_back(v); } vector<int> euler(vector<multiset<int>> &graph) { vector<int> cycle; eulerRec(graph, 0, cycle); reverse(cycle.begin(), cycle.end()); return cycle; }
Итеративная реализация
vector<int> euler(vector<multiset<int>> &graph) { vector<int> stack = { 0 }, cycle; while (!stack.empty()) { int v = stack.back(); if (!graph[v].empty()) { int to = *graph[v].begin(); graph[v].erase(graph[v].find(to)); //graph[to].erase(graph[to].find(v)); stack.push_back(to); } else { stack.pop_back(); cycle.push_back(v); } } reverse(cycle.begin(), cycle.end()); return cycle; }