Эйлеров цикл. Эйлеров путь: различия между версиями
Перейти к навигации
Перейти к поиску
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;
}