-
Notifications
You must be signed in to change notification settings - Fork 23
additional tasks by Krivoruchko Dmitry #24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
UmbrellaLeaf5
wants to merge
82
commits into
AlgorithmsDafeMipt2024:main
Choose a base branch
from
UmbrellaLeaf5:additional_tasks
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 75 commits
Commits
Show all changes
82 commits
Select commit
Hold shift + click to select a range
9cfcf59
delete extra extension from docker
UmbrellaLeaf5 39f8a8f
update format CMakeLists
UmbrellaLeaf5 aa962ae
update lib folder
UmbrellaLeaf5 6e59658
update lib->utils name in CMakeLists
UmbrellaLeaf5 b5d47d1
Merge remote-tracking branch 'upstream/main'
UmbrellaLeaf5 ae45494
README beautify
UmbrellaLeaf5 6032727
add graph_additional_task
UmbrellaLeaf5 bcd54e5
docker file back
UmbrellaLeaf5 5230994
update edge.Name()
UmbrellaLeaf5 cf04922
update class Graph with unordered_map as AdjList
UmbrellaLeaf5 4c939f8
update names and comments
UmbrellaLeaf5 ff9397f
Merge remote-tracking branch 'upstream/main' into graph_additional_task
UmbrellaLeaf5 1ccac8e
CMakeLists hotfix
UmbrellaLeaf5 64008e7
Merge remote-tracking branch 'origin/graph_additional_task' into stro…
UmbrellaLeaf5 3976ff9
move graph to lib
UmbrellaLeaf5 04c762f
Merge remote-tracking branch 'upstream/main' into strongly_connected_…
UmbrellaLeaf5 b85a801
Merge remote-tracking branch 'upstream/main' into graph_additional_task
UmbrellaLeaf5 ffa9925
and const
UmbrellaLeaf5 4e8ea35
create folder
UmbrellaLeaf5 b9d5975
finish primary realization
UmbrellaLeaf5 c47cb73
fix mistakes
UmbrellaLeaf5 4fa263b
update README.md and add comments
UmbrellaLeaf5 8691cba
add tests
UmbrellaLeaf5 b224e5b
move graph class to lib
UmbrellaLeaf5 4ddb11c
create folder for dag_relaxation
UmbrellaLeaf5 6bfef24
add topological_sort from task_01
UmbrellaLeaf5 ffd686d
primary complete dag_relaxation
UmbrellaLeaf5 fb1cbba
add more exception throwing
UmbrellaLeaf5 0919619
code beautify
UmbrellaLeaf5 f737732
fix typo
UmbrellaLeaf5 05774f8
fix typo and add ContainsVert method in graph class
UmbrellaLeaf5 60b581a
fix typo and add ContainsVert method in graph class
UmbrellaLeaf5 6672c40
add ContainsVert method
UmbrellaLeaf5 60f10e7
code beautify
UmbrellaLeaf5 80637ba
add tests
UmbrellaLeaf5 a530c1f
update README.md
UmbrellaLeaf5 12dc12a
beautify concepts (move from constructor)
UmbrellaLeaf5 4000c47
beautify concepts (move from constructor) in graph class
UmbrellaLeaf5 b553558
beautify concepts (move from constructor) in graph class
UmbrellaLeaf5 729a22e
Merge remote-tracking branch 'upstream/main' into strongly_connected_…
UmbrellaLeaf5 664a7e5
Merge remote-tracking branch 'upstream/main' into dag_relaxation_addi…
UmbrellaLeaf5 cfc14c9
Merge remote-tracking branch 'upstream/main' into graph_additional_task
UmbrellaLeaf5 f1d3404
code beautify
UmbrellaLeaf5 6cb4ae5
code beautify
UmbrellaLeaf5 f01684b
code beautify
UmbrellaLeaf5 dd17ff5
change static funcs to anonymous namespace
UmbrellaLeaf5 19cffc6
update CMakeLists.txt
UmbrellaLeaf5 f4321ff
update CMakeLists.txt
UmbrellaLeaf5 01b22c8
update CMakeLists.txt
UmbrellaLeaf5 5dee1f6
change static funcs to anonymous namespace
UmbrellaLeaf5 650045a
code beautify
UmbrellaLeaf5 d40c1bd
code beautify
UmbrellaLeaf5 903be8b
fix tests
UmbrellaLeaf5 16f71c5
update task using Petya and Vasya scary maze problem
UmbrellaLeaf5 1f3015b
update tests and README.md
UmbrellaLeaf5 8cdba58
update task using chemical experiments problem
UmbrellaLeaf5 e252cdf
move graph class to lib
UmbrellaLeaf5 2382a0d
Merge branch 'strongly_connected_components_additional_task' into add…
UmbrellaLeaf5 ce2993f
Merge branch 'dag_relaxation_additional_task' into additional_tasks
UmbrellaLeaf5 609b741
rename algorithms folders to tasks names
UmbrellaLeaf5 7a14ed6
rename: start_vert -> start in DAGRelaxation
UmbrellaLeaf5 380efe7
add AStar primary realization
UmbrellaLeaf5 c87ebc8
optimize AStar: remove non_visited_verts
UmbrellaLeaf5 c2b29aa
code beautify
UmbrellaLeaf5 b7fda02
update comments
UmbrellaLeaf5 5a1efed
add GoodSolution and its maze parsing
UmbrellaLeaf5 5d4385a
update tests
UmbrellaLeaf5 b600b27
update README.md
UmbrellaLeaf5 a67d809
update comments in graph class and add move constructor
UmbrellaLeaf5 cbe81d7
update graph class: allow negative weight and add more template types
UmbrellaLeaf5 dfe0bfe
fix bugs in methods in class graph connected with undirected graph
UmbrellaLeaf5 e5fa95a
complete GitHub suggestions
UmbrellaLeaf5 1097fec
code beautify
UmbrellaLeaf5 fc5f0d2
rename: GetWeightOfEdge -> GetEdgeWeight, ParseEdgeString -> ParseEdg…
UmbrellaLeaf5 6d560f1
add graph class methods: GetEdgeIter, SetEdgeWeight
UmbrellaLeaf5 5761e70
move all methods in graph class to graph.hpp
UmbrellaLeaf5 efa50c7
move graph.hpp and utils.hpp to .. folder
UmbrellaLeaf5 fc3e316
update graph class (code simplify and beautify)
UmbrellaLeaf5 6e411db
update graph class (consts and integral->arithmetic)
UmbrellaLeaf5 07019ff
CMake structure update and code beautify
UmbrellaLeaf5 8afd94e
complete find_word_chains additional_task
UmbrellaLeaf5 2db05e3
complete bridge_guards additional_task
UmbrellaLeaf5 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,23 @@ | ||
cmake_minimum_required(VERSION 3.10) | ||
cmake_minimum_required(VERSION 3.20) | ||
|
||
project(homeworks) | ||
project(homeworks LANGUAGES CXX) | ||
|
||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib) | ||
set(CMAKE_CXX_STANDARD 20) | ||
set(CMAKE_CXX_STANDARD_REQUIRED ON) | ||
set(CMAKE_CXX_FLAGS "-Wall -Wextra -pedantic -std=c++20 -O2") | ||
|
||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib) | ||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sandbox) | ||
|
||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/additional_tasks) | ||
|
||
file(GLOB_RECURSE tasks_dirs LIST_DIRECTORIES true ".") | ||
|
||
foreach(dir ${tasks_dirs}) | ||
IF(IS_DIRECTORY ${dir}) | ||
IF(${dir} MATCHES "task_0[0-9]$" AND NOT ${dir} MATCHES "build") | ||
add_subdirectory(${dir}) | ||
ENDIF() | ||
ELSE() | ||
CONTINUE() | ||
IF(IS_DIRECTORY ${dir}) | ||
IF(${dir} MATCHES "task_0[0-9]$" AND NOT ${dir} MATCHES "build") | ||
add_subdirectory(${dir}) | ||
ENDIF() | ||
ELSE() | ||
CONTINUE() | ||
ENDIF() | ||
endforeach() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,10 @@ | ||
# Домашнее задание для 2 семестра алгоритмов и структур данных | ||
## (Homework for second semester algorithms and data structures on MIPT DAFE/RSE) | ||
|
||
### Для удобства можно пользоваться папкой lib, все файлы из этой папки будут подключаться к любой задаче | ||
|
||
### Можно получить дополнительные баллы, если добавить интересные текстовые задачи. Необходимы текст задачи, решение и тесты. Каждая задача отдельный ПР, полчуть дополнительные баллы можно только если пулл реквест замержен в основную ветку. | ||
Можно получить дополнительные баллы, если добавить интересные текстовые задачи. Необходимы текст задачи, решение и тесты. Каждая задача отдельный - Pull Request, получить дополнительные баллы можно только если PR замерджен в основную ветку. | ||
|
||
### Можно получить дополнительные баллы, если добавить теорию в папку doc. Делается в отдельном ПР, полчуть дополнительные баллы можно только если пулл реквест замержен в основную ветку. | ||
Можно получить дополнительные баллы, если добавить теорию в папку doc. Делается в отдельном PR, только если PR замерджен в основную ветку. | ||
|
||
### Код должен быть отформатирован clang-format'ом со стилем Google | ||
Код должен быть отформатирован clang-format'ом со стилем Google. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
cmake_minimum_required(VERSION 3.10) | ||
|
||
get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) | ||
string(REPLACE " " "_" PROJECT_NAME ${PROJECT_NAME}) | ||
project(${PROJECT_NAME} C CXX) | ||
|
||
set(CMAKE_CXX_STANDARD 23) | ||
set(CMAKE_CXX_STANDARD_REQUIRED ON) | ||
|
||
file(GLOB_RECURSE source_list "src/*.cpp" "src/*.hpp") | ||
file(GLOB_RECURSE main_source_list "src/main.cpp") | ||
file(GLOB_RECURSE test_source_list "src/*.cpp") | ||
file(GLOB_RECURSE test_list "src/*test.cpp") | ||
|
||
list(REMOVE_ITEM test_source_list ${main_source_list}) | ||
list(REMOVE_ITEM source_list ${test_list}) | ||
|
||
include_directories(${PROJECT_NAME} PUBLIC src) | ||
|
||
add_executable(${PROJECT_NAME} ${source_list}) | ||
|
||
# Locate GTest | ||
enable_testing() | ||
find_package(GTest REQUIRED) | ||
include_directories(${GTEST_INCLUDE_DIRS}) | ||
|
||
find_library(Utils ../) | ||
target_link_libraries(${PROJECT_NAME} PUBLIC Utils) | ||
|
||
# Link runTests with what we want to test and the GTest and pthread library | ||
add_executable(${PROJECT_NAME}_tests ${test_source_list}) | ||
target_link_libraries( | ||
${PROJECT_NAME}_tests | ||
GTest::gtest_main | ||
Utils | ||
) | ||
|
||
include(GoogleTest) | ||
gtest_discover_tests(${PROJECT_NAME}_tests) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
# Задача: обратимые состояния в цепочке химических экспериментов | ||
|
||
В прогрессивной Московской химической лаборатории используют новые методы описания цепочки экспериментов: лаборанты изображают их в виде графов, вершинами которого являются состояния вещества, а эксперименты - ребрами. | ||
|
||
Таким образом компании, разрабатывающей программное обеспечение, используя методы хемоинформатики, очень удобно использовать эксперименты этой лаборатории в своих наработках. В одном из проектов им потребовалось найти исключительно полезные состояния, обладающие свойством обратимости в цепочке. | ||
|
||
К обратимым экспериментам относят те, результирующее состояние вещества которых можно вернуть к исходному, через другие процессы в той же цепочке; в таком случае результирующее состояния вещества также называют обратимым. | ||
|
||
Найдите по известной цепочке экспериментов, оформленной в виде графа, эти обратимые состояния. | ||
|
||
## Входные данные: | ||
|
||
* Первая строка содержит целое число `N` (`N` > 0) — количество экспериментов в графе. | ||
* Следующие `N` строк содержат по два поля, разделенных пробелом: `A` `B`, где `A` и `B` — это строковые имена вершин (состояния веществ). Ребро идет от вершины `A` к вершине `B`. Имена вершин могут содержать любые символы, кроме пробела, переноса строки и пр. | ||
|
||
## Выходные данные: | ||
|
||
* Выходные данные представляют собой строку, содержащую через пробел имена всех обратимых состояний (порядок вывода обратимых состояний не важен, состояния выводятся без повторений) | ||
* Если обратимых состояний нет, то вывод должен быть пустым. | ||
|
||
# Используемый алгоритм: нахождение компонент сильной связности алгоритмом Тарьяна | ||
|
||
## Как работает алгоритм Тарьяна: | ||
|
||
Алгоритм Тарьяна - это подход к решению задачи поиска компонент сильной связности (СС) в ориентированном графе. Он работает за линейное время (`O(|V|+|E|)`, где `V` - количество вершин, а `E` - количество ребер) и использует рекурсию для эффективного обхода графа. | ||
|
||
Алгоритм Тарьяна основывается на том, что вершина `v` является корнем СС тогда и только тогда, когда ее “низкая связь” (`low_links`) равна ее “времени входа” (`indexes`). “Низкая связь” - это минимальное “время входа” всех вершин, которые можно достичь из `v` по пути рекурсии. | ||
|
||
Иначе говоря, вершины рассматриваются в обратном топологическом порядке, поэтому в конце рекурсивной функции для исходной вершины не будет встречено ни одной вершины из той же компоненты сильной связности, так как все вершины, достижимые из исходной, уже обработаны, и обратные связи в дереве дают второй путь из одной вершины в другую и связывают компоненты сильной связности в одну. | ||
|
||
## Объяснение кода: | ||
|
||
```C++ | ||
template <typename vert_t> | ||
static void StronglyConnectedComponentsStep( | ||
const vert_t& v, size_t& curr_index, std::stack<vert_t>& verts_stack, | ||
std::unordered_map<vert_t, size_t>& indexes, | ||
std::unordered_map<vert_t, size_t>& low_links, | ||
std::unordered_map<vert_t, bool>& is_on_stack, | ||
std::unordered_map<vert_t, std::vector<vert_t>>& adj_list, | ||
std::vector<std::vector<vert_t>>& strongly_connected_components); | ||
``` | ||
|
||
С помощью функции выше выполняется рекурсивный обход. | ||
|
||
Для каждой вершины `v`, которая еще не была посещена, выполняется рекурсивный обход. При первом посещении вершины `v`, `indexes[v]` устанавливается равным `curr_index`, `low_links[v]` также устанавливается равным `curr_index`. `curr_index` увеличивается на 1. Вершина `v` помещается в стек `verts_stack`. | ||
|
||
Для каждой смежной вершины `w` вершине `v` выполняется следующее: | ||
1. Если w не была посещена (```indexes[w] == 0```): выполняется рекурсивный вызов StronglyConnectedComponentsStep для вершины `w`, `low_links[v]` обновляется минимальным значением между текущим значением и `low_links[w]`. | ||
2. Если w уже находится в стеке (`is_on_stack[w]`): | ||
`low_links[v]` обновляется минимальным значением между текущим значением и `low_links[w]`. | ||
|
||
После обработки всех смежных вершин, если ```low_links[v] == indexes[v]```, это означает, что `v` является корнем СС. | ||
В этом случае все вершины, которые находятся в стеке от v до вершины, которая была обработана ранее, также принадлежат этой СС. | ||
Вершины удаляются из стека, пока v не будет удален. Эти удаленные вершины образуют СС, которая добавляется в список СС. | ||
|
||
```C++ | ||
/** | ||
* @brief Поиск компонент сильной связности в ориентированного графа по | ||
* алгоритму Тарьяна | ||
* @tparam vert_t: тип вершин | ||
* @tparam weight_t: тип весов | ||
* @param graph: исходный граф | ||
* @throw std::invalid_argument("StronglyConnectedComponents: graph is not | ||
* directed."); | ||
* @return std::vector<std::vector<vert_t>>: компоненты сильной связности | ||
*/ | ||
template <AllowedVertType vert_t, AllowedWeightType weight_t> | ||
std::vector<std::vector<vert_t>> StronglyConnectedComponents( | ||
Graph<vert_t, weight_t> graph); | ||
``` | ||
|
||
Основная функция выше вызывает ```StronglyConnectedComponentsStep(...)``` для каждой вершины графа и возвращает список компонент. |
26 changes: 26 additions & 0 deletions
26
additional_tasks/chem_experiments_chain/src/chem_experiments_chain.hpp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
#include "tarjan_algorithm.hpp" | ||
|
||
/// @brief Решает задачу: "обратимые состояния в цепочке химических | ||
/// экспериментов" | ||
void Solution(std::istream& is = std::cin, std::ostream& os = std::cout) { | ||
size_t experiments_amount; | ||
is >> experiments_amount; | ||
|
||
Graph<std::string, long> graph; | ||
graph.MakeDirected(); | ||
|
||
for (size_t i = 0; i < experiments_amount; i++) { | ||
std::string u, v; | ||
is >> u >> v; | ||
|
||
graph.AddEdge(u, v); | ||
graph.AddVert(u); | ||
graph.AddVert(v); | ||
} | ||
|
||
for (const auto& component : StronglyConnectedComponents(graph)) | ||
if (component.size() != 1 && !component.empty()) | ||
for (const auto& elem : component) os << elem << " "; | ||
|
||
os << std::endl; | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#include "chem_experiments_chain.hpp" | ||
|
||
int main() { | ||
Solution(); | ||
return 0; | ||
} |
108 changes: 108 additions & 0 deletions
108
additional_tasks/chem_experiments_chain/src/tarjan_algorithm.hpp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
#pragma once | ||
|
||
#include <algorithm> | ||
#include <stack> | ||
#include <stdexcept> | ||
|
||
#include "graph/graph.hpp" | ||
|
||
namespace { | ||
|
||
template <AllowedVertType vert_t> | ||
inline void StronglyConnectedComponentsStep( | ||
const vert_t& vert, size_t& curr_index, std::stack<vert_t>& verts_stack, | ||
std::unordered_map<vert_t, size_t>& indexes, | ||
std::unordered_map<vert_t, size_t>& low_links, | ||
std::unordered_map<vert_t, bool>& is_on_stack, | ||
std::unordered_map<vert_t, std::vector<vert_t>>& adj_list, | ||
std::vector<std::vector<vert_t>>& strongly_connected_components) { | ||
// в curr_index храним количество ранее обработанных вершин, | ||
// indexes[vert] - это "время входа" в вершину vert | ||
indexes[vert] = low_links[vert] = curr_index++; | ||
|
||
verts_stack.push(vert); | ||
|
||
// is_on_stack нужно, чтобы проверять принадлежность вершины стеку за O(1) | ||
is_on_stack[vert] = true; | ||
|
||
// перебираем рёбра, исходящие из vert | ||
for (auto& u_vert : adj_list[vert]) { | ||
if (indexes[u_vert] == 0) { | ||
// вершина u_vert ранее не посещалась; запускаемся из неё рекурсивно | ||
StronglyConnectedComponentsStep(u_vert, curr_index, verts_stack, indexes, | ||
low_links, is_on_stack, adj_list, | ||
strongly_connected_components); | ||
|
||
low_links[vert] = std::min(low_links[vert], low_links[u_vert]); | ||
} else if (is_on_stack[u_vert]) | ||
// вершина u_vert находится в стеке, значит, принадлежит той же компоненте | ||
// сильной связности, что и vert | ||
|
||
// если u_vert не в стеке, значит, ребро (vert, u_vert) ведёт в ранее | ||
// обработанную компоненту сильной связности и должна быть проигнорирована | ||
low_links[vert] = std::min(low_links[vert], low_links[u_vert]); | ||
} | ||
|
||
// вершина vert - корень текущей компоненты сильной связности, | ||
// все вершины в стеке от vert и выше образуют эту компоненту | ||
if (low_links[vert] == indexes[vert]) { | ||
vert_t u_vert; | ||
std::vector<vert_t> strongly_connected_component; | ||
|
||
do { | ||
u_vert = verts_stack.top(); | ||
verts_stack.pop(); | ||
|
||
is_on_stack[u_vert] = false; | ||
strongly_connected_component.push_back(u_vert); | ||
} while (u_vert != vert); | ||
|
||
strongly_connected_components.push_back(strongly_connected_component); | ||
} | ||
} | ||
|
||
} // namespace | ||
|
||
/** | ||
* @brief Поиск компонент сильной связности в ориентированного графа по | ||
* алгоритму Тарьяна. | ||
* @tparam vert_t: тип вершин | ||
* @tparam weight_t: тип весов | ||
* @param graph: исходный граф | ||
UmbrellaLeaf5 marked this conversation as resolved.
Show resolved
Hide resolved
UmbrellaLeaf5 marked this conversation as resolved.
Show resolved
Hide resolved
UmbrellaLeaf5 marked this conversation as resolved.
Show resolved
Hide resolved
UmbrellaLeaf5 marked this conversation as resolved.
Show resolved
Hide resolved
UmbrellaLeaf5 marked this conversation as resolved.
Show resolved
Hide resolved
UmbrellaLeaf5 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
* @throw `std::invalid_argument("StronglyConnectedComponents: graph is not | ||
* directed.")`. | ||
* @return `std::vector<std::vector<vert_t>>`: компоненты сильной связности | ||
*/ | ||
template <AllowedVertType vert_t, AllowedWeightType weight_t> | ||
std::vector<std::vector<vert_t>> StronglyConnectedComponents( | ||
const Graph<vert_t, weight_t>& graph) { | ||
if (!graph.IsDirected()) | ||
throw std::invalid_argument( | ||
"StronglyConnectedComponents: graph is not directed."); | ||
|
||
if (graph.Verts().empty()) return {}; | ||
|
||
std::vector<std::vector<vert_t>> strongly_connected_component; | ||
|
||
std::stack<vert_t> verts_stack; | ||
size_t curr_index = 0; | ||
|
||
std::unordered_map<vert_t, std::vector<vert_t>> adj_list = graph.GetAdjList(); | ||
|
||
std::unordered_map<vert_t, size_t> indexes; | ||
std::unordered_map<vert_t, size_t> low_links; | ||
std::unordered_map<vert_t, bool> is_on_stack; | ||
|
||
for (const auto& vert : graph.Verts()) { | ||
indexes[vert] = low_links[vert] = 0; | ||
is_on_stack[vert] = false; | ||
} | ||
|
||
for (const auto& vert : graph.Verts()) | ||
if (indexes[vert] == 0) | ||
StronglyConnectedComponentsStep(vert, curr_index, verts_stack, indexes, | ||
low_links, is_on_stack, adj_list, | ||
strongly_connected_component); | ||
|
||
return strongly_connected_component; | ||
} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.