Skip to content
Open
Show file tree
Hide file tree
Changes from 69 commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
9cfcf59
delete extra extension from docker
UmbrellaLeaf5 Sep 7, 2024
39f8a8f
update format CMakeLists
UmbrellaLeaf5 Sep 7, 2024
aa962ae
update lib folder
UmbrellaLeaf5 Sep 7, 2024
6e59658
update lib->utils name in CMakeLists
UmbrellaLeaf5 Sep 14, 2024
b5d47d1
Merge remote-tracking branch 'upstream/main'
UmbrellaLeaf5 Sep 21, 2024
ae45494
README beautify
UmbrellaLeaf5 Sep 21, 2024
6032727
add graph_additional_task
UmbrellaLeaf5 Sep 27, 2024
bcd54e5
docker file back
UmbrellaLeaf5 Sep 27, 2024
5230994
update edge.Name()
UmbrellaLeaf5 Sep 29, 2024
cf04922
update class Graph with unordered_map as AdjList
UmbrellaLeaf5 Sep 30, 2024
4c939f8
update names and comments
UmbrellaLeaf5 Sep 30, 2024
ff9397f
Merge remote-tracking branch 'upstream/main' into graph_additional_task
UmbrellaLeaf5 Oct 4, 2024
1ccac8e
CMakeLists hotfix
UmbrellaLeaf5 Oct 4, 2024
64008e7
Merge remote-tracking branch 'origin/graph_additional_task' into stro…
UmbrellaLeaf5 Oct 5, 2024
3976ff9
move graph to lib
UmbrellaLeaf5 Oct 5, 2024
04c762f
Merge remote-tracking branch 'upstream/main' into strongly_connected_…
UmbrellaLeaf5 Oct 5, 2024
b85a801
Merge remote-tracking branch 'upstream/main' into graph_additional_task
UmbrellaLeaf5 Oct 5, 2024
ffa9925
and const
UmbrellaLeaf5 Oct 6, 2024
4e8ea35
create folder
UmbrellaLeaf5 Oct 6, 2024
b9d5975
finish primary realization
UmbrellaLeaf5 Oct 7, 2024
c47cb73
fix mistakes
UmbrellaLeaf5 Oct 7, 2024
4fa263b
update README.md and add comments
UmbrellaLeaf5 Oct 7, 2024
8691cba
add tests
UmbrellaLeaf5 Oct 7, 2024
b224e5b
move graph class to lib
UmbrellaLeaf5 Oct 25, 2024
4ddb11c
create folder for dag_relaxation
UmbrellaLeaf5 Oct 25, 2024
6bfef24
add topological_sort from task_01
UmbrellaLeaf5 Oct 6, 2024
ffd686d
primary complete dag_relaxation
UmbrellaLeaf5 Oct 25, 2024
fb1cbba
add more exception throwing
UmbrellaLeaf5 Oct 25, 2024
0919619
code beautify
UmbrellaLeaf5 Oct 25, 2024
f737732
fix typo
UmbrellaLeaf5 Oct 25, 2024
05774f8
fix typo and add ContainsVert method in graph class
UmbrellaLeaf5 Oct 25, 2024
60b581a
fix typo and add ContainsVert method in graph class
UmbrellaLeaf5 Oct 25, 2024
6672c40
add ContainsVert method
UmbrellaLeaf5 Oct 25, 2024
60f10e7
code beautify
UmbrellaLeaf5 Oct 25, 2024
80637ba
add tests
UmbrellaLeaf5 Oct 26, 2024
a530c1f
update README.md
UmbrellaLeaf5 Oct 26, 2024
12dc12a
beautify concepts (move from constructor)
UmbrellaLeaf5 Oct 26, 2024
4000c47
beautify concepts (move from constructor) in graph class
UmbrellaLeaf5 Oct 26, 2024
b553558
beautify concepts (move from constructor) in graph class
UmbrellaLeaf5 Oct 26, 2024
729a22e
Merge remote-tracking branch 'upstream/main' into strongly_connected_…
UmbrellaLeaf5 Oct 27, 2024
664a7e5
Merge remote-tracking branch 'upstream/main' into dag_relaxation_addi…
UmbrellaLeaf5 Oct 27, 2024
cfc14c9
Merge remote-tracking branch 'upstream/main' into graph_additional_task
UmbrellaLeaf5 Oct 27, 2024
f1d3404
code beautify
UmbrellaLeaf5 Oct 27, 2024
6cb4ae5
code beautify
UmbrellaLeaf5 Oct 27, 2024
f01684b
code beautify
UmbrellaLeaf5 Oct 27, 2024
dd17ff5
change static funcs to anonymous namespace
UmbrellaLeaf5 Oct 27, 2024
19cffc6
update CMakeLists.txt
UmbrellaLeaf5 Oct 29, 2024
f4321ff
update CMakeLists.txt
UmbrellaLeaf5 Oct 29, 2024
01b22c8
update CMakeLists.txt
UmbrellaLeaf5 Oct 29, 2024
5dee1f6
change static funcs to anonymous namespace
UmbrellaLeaf5 Oct 30, 2024
650045a
code beautify
UmbrellaLeaf5 Oct 30, 2024
d40c1bd
code beautify
UmbrellaLeaf5 Oct 30, 2024
903be8b
fix tests
UmbrellaLeaf5 Nov 16, 2024
16f71c5
update task using Petya and Vasya scary maze problem
UmbrellaLeaf5 Nov 17, 2024
1f3015b
update tests and README.md
UmbrellaLeaf5 Nov 17, 2024
8cdba58
update task using chemical experiments problem
UmbrellaLeaf5 Nov 18, 2024
e252cdf
move graph class to lib
UmbrellaLeaf5 Oct 25, 2024
2382a0d
Merge branch 'strongly_connected_components_additional_task' into add…
UmbrellaLeaf5 Nov 23, 2024
ce2993f
Merge branch 'dag_relaxation_additional_task' into additional_tasks
UmbrellaLeaf5 Nov 23, 2024
609b741
rename algorithms folders to tasks names
UmbrellaLeaf5 Nov 23, 2024
7a14ed6
rename: start_vert -> start in DAGRelaxation
UmbrellaLeaf5 Nov 25, 2024
380efe7
add AStar primary realization
UmbrellaLeaf5 Nov 25, 2024
c87ebc8
optimize AStar: remove non_visited_verts
UmbrellaLeaf5 Nov 25, 2024
c2b29aa
code beautify
UmbrellaLeaf5 Nov 25, 2024
b7fda02
update comments
UmbrellaLeaf5 Nov 25, 2024
5a1efed
add GoodSolution and its maze parsing
UmbrellaLeaf5 Nov 25, 2024
5d4385a
update tests
UmbrellaLeaf5 Nov 25, 2024
b600b27
update README.md
UmbrellaLeaf5 Nov 25, 2024
a67d809
update comments in graph class and add move constructor
UmbrellaLeaf5 Nov 29, 2024
cbe81d7
update graph class: allow negative weight and add more template types
UmbrellaLeaf5 Nov 29, 2024
dfe0bfe
fix bugs in methods in class graph connected with undirected graph
UmbrellaLeaf5 Nov 29, 2024
e5fa95a
complete GitHub suggestions
UmbrellaLeaf5 Nov 29, 2024
1097fec
code beautify
UmbrellaLeaf5 Nov 29, 2024
fc5f0d2
rename: GetWeightOfEdge -> GetEdgeWeight, ParseEdgeString -> ParseEdg…
UmbrellaLeaf5 Dec 7, 2024
6d560f1
add graph class methods: GetEdgeIter, SetEdgeWeight
UmbrellaLeaf5 Dec 8, 2024
5761e70
move all methods in graph class to graph.hpp
UmbrellaLeaf5 Dec 8, 2024
efa50c7
move graph.hpp and utils.hpp to .. folder
UmbrellaLeaf5 Dec 8, 2024
fc3e316
update graph class (code simplify and beautify)
UmbrellaLeaf5 Dec 9, 2024
6e411db
update graph class (consts and integral->arithmetic)
UmbrellaLeaf5 Jan 13, 2025
07019ff
CMake structure update and code beautify
UmbrellaLeaf5 Jan 14, 2025
8afd94e
complete find_word_chains additional_task
UmbrellaLeaf5 Jan 15, 2025
2db05e3
complete bridge_guards additional_task
UmbrellaLeaf5 Jan 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 44 additions & 44 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,48 +1,48 @@
// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.195.0/containers/cpp
{
"name": "C++",
"build": {
"dockerfile": "Dockerfile",
// Update 'VARIANT' to pick an Debian / Ubuntu OS version: debian-11, debian-10, debian-9, ubuntu-21.04, ubuntu-20.04, ubuntu-18.04
// Use Debian 11, Debian 9, Ubuntu 18.04 or Ubuntu 21.04 on local arm64/Apple Silicon
"args": {
"VARIANT": "ubuntu-24.04"
}
},
"runArgs": [
"--cap-add=SYS_PTRACE",
"--security-opt",
"seccomp=unconfined"
],
// Configure tool-specific properties.
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
// Set *default* container specific settings.json values on container create.
"settings": {
"C_Cpp.clang_format_fallbackStyle": "Google",
"C_Cpp.clang_format_path": "clang-format",
"C_Cpp.clang_format_style": "file",
"C_Cpp.formatting": "clangFormat",
"clang-format.executable": "clang-format",
"clang-format.fallbackStyle": "Google",
"clang-format.language.cpp.enable": true,
"clang.executable": "clang",
"editor.formatOnSave": true
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"llvm-vs-code-extensions.vscode-clangd",
"ms-vscode.cpptools",
"xaver.clang-format"
]
}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "gcc -v",
// Comment out this line to run as root instead.
"remoteUser": "vscode"
"name": "C++",
"build": {
"dockerfile": "Dockerfile",
// Update 'VARIANT' to pick an Debian / Ubuntu OS version: debian-11, debian-10, debian-9, ubuntu-21.04, ubuntu-20.04, ubuntu-18.04
// Use Debian 11, Debian 9, Ubuntu 18.04 or Ubuntu 21.04 on local arm64/Apple Silicon
"args": {
"VARIANT": "ubuntu-24.04"
}
},
"runArgs": [
"--cap-add=SYS_PTRACE",
"--security-opt",
"seccomp=unconfined"
],
// Configure tool-specific properties.
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
// Set *default* container specific settings.json values on container create.
"settings": {
"C_Cpp.clang_format_fallbackStyle": "Google",
"C_Cpp.clang_format_path": "clang-format",
"C_Cpp.clang_format_style": "file",
"C_Cpp.formatting": "clangFormat",
"clang-format.executable": "clang-format",
"clang-format.fallbackStyle": "Google",
"clang-format.language.cpp.enable": true,
"clang.executable": "clang",
"editor.formatOnSave": true
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"llvm-vs-code-extensions.vscode-clangd",
"ms-vscode.cpptools",
"xaver.clang-format"
]
}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "gcc -v",
// Comment out this line to run as root instead.
"remoteUser": "vscode"
}
22 changes: 12 additions & 10 deletions CMakeLists.txt
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()
7 changes: 4 additions & 3 deletions README.md
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.
12 changes: 6 additions & 6 deletions additional_tasks/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ project(additional_tasks)
file(GLOB_RECURSE tasks_dirs LIST_DIRECTORIES true ".")

foreach(dir ${tasks_dirs})
IF(IS_DIRECTORY ${dir})
IF(NOT ${dir} MATCHES ".*src.*")
add_subdirectory(${dir})
ENDIF()
ELSE()
CONTINUE()
IF(IS_DIRECTORY ${dir})
IF(NOT ${dir} MATCHES ".*src.*")
add_subdirectory(${dir})
ENDIF()
ELSE()
CONTINUE()
ENDIF()
endforeach()
39 changes: 39 additions & 0 deletions additional_tasks/chem_experiments_chain/CMakeLists.txt
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)
73 changes: 73 additions & 0 deletions additional_tasks/chem_experiments_chain/README.md
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(...)``` для каждой вершины графа и возвращает список компонент.
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;
}
6 changes: 6 additions & 0 deletions additional_tasks/chem_experiments_chain/src/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#include "chem_experiments_chain.hpp"

int main() {
Solution();
return 0;
}
Loading