allforgraphs


Nameallforgraphs JSON
Version 1.0.1 PyPI version JSON
download
home_pagehttps://github.com/Katerok27153/allforgraphs.git
SummaryLibrary for graphs.
upload_time2024-12-19 17:38:29
maintainerNone
docs_urlNone
authorkatya,maria,olga
requires_python>=3.6
licenseNone
keywords files speedfiles
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # allforgraphs Library #

## What is this? ##
allforgraphs – это библиотека для работы с графами и построением матриц. Она включает в себя два модуля: алгоритмы для задач с графами и методы генерации матриц.

## Quick Guide ##
### Структура библиотеки ###

allforgraphs состоит из двух модулей:

1. algorithms - Модуль для работы с алгоритмами графа.
2. matrices - Модуль для работы с матрицами, связанными с графами.

## Installation ## 

Чтобы начать работу с allforgraphs, установите её через pip:

```pip install allforgraphs```


## Using ##

После установки библиотеку можно импортировать с помощью:

``` python
from allforgraphs import *
```

## Modules Overview ##

### Algorithms Module ###

#### Функция find_shortest_path(edges_input, start_node, end_node) позволяет находить кратчайший путь между двумя узлами в ориентированном графе, используя алгоритм Дейкстры. #####

Параметры:

1. edges_input: список рёбер графа, где каждое ребро представлено кортежем (weight, node1, node2), где weight — это вес ребра, а node1 и node2 — вершины, соединённые этим ребром.
2. start_node: узел, от которого начинается поиск кратчайшего пути.
3. end_node: узел, до которого необходимо найти путь.

Возвращает:
Кортеж, содержащий кратчайшее расстояние и сам путь в виде списка узлов.

Пример использования: 

``` python
from allforgraphs.algorithms.dr import find_shortest_path

edges_input = [
    (11, 3, 1), (5, 4, 3), (8, 5, 4), (12, 6, 5), (3, 8, 6), 
    (14, 8, 20), (7, 19, 20), (2, 19, 7), (9, 2, 7), (4, 1, 2),
    (10, 7, 32), (6, 32, 31), (15, 32, 34), (13, 31, 7), 
    (1, 34, 31), (8, 19, 21), (11, 21, 20), (7, 29, 8), 
    (2, 29, 30), (5, 33, 29), (14, 8, 30), (6, 30, 33), 
    (12, 31, 22), (3, 24, 22), (9, 22, 25), (5, 26, 24), 
    (7, 25, 26), (13, 26, 23), (1, 23, 30), (4, 26, 27), 
    (8, 27, 28), (2, 23, 28), (10, 11, 12), (15, 13, 14), 
    (12, 16, 15), (6, 18, 17)
]
start_node = 34
end_node = 8

distance, path = find_shortest_path(edges_input, start_node, end_node)
print(f"Кратчайшее расстояние от {start_node} до {end_node}: {distance}")
print(f"Путь: {' -> '.join(map(str, path))}")
```

#### Функция kruskal_maximum_tree(edges_input) реализует алгоритм Краскала для нахождения максимального охватывающего дерева в графе ####

Параметры:

1. edges_input: список рёбер графа в формате (weight, node1, node2), где weight — это вес ребра, а node1 и node2 — вершины, соединённые этим ребром.

Возвращает:
Кортеж, содержащий список рёбер максимального покрывающего дерева и его общий вес.

Пример использования: 

``` python
from allforgraphs.algorithms.kr_max import kruskal_maximum_tree

edges_input = [
    (9, 0, 1), (12, 0, 2), (10, 1, 2), (15, 1, 3),
    (5, 2, 3), (20, 2, 4), (25, 3, 4), (30, 4, 5)
]

max_tree_edges, max_tree_weight = kruskal_maximum_tree(edges_input)

print('Максимальное покрывающее дерево:')
for edge in max_tree_edges:
    print(f'Вес: {edge[0]}, Вершины: ({edge[1]}, {edge[2]})')

print('Общий вес максимального покрывающего дерева:', max_tree_weight)
```

#### Функция kruskal_minimum_tree(edges_input) реализует алгоритм Краскала для нахождения минимального охватывающего дерева в графе. ####

Параметры:

1. edges_input: список рёбер графа в формате (weight, node1, node2), где weight — это вес ребра, а node1 и node2 — вершины, соединённые этим ребром.

Возвращает:
Кортеж, содержащий список рёбер минимального покрывающего дерева и его общий вес.

Пример использования: 

``` python
from allforgraphs.algorithms.kr_min import kruskal_minimum_tree

edges_input = [
    (11, 3, 1), (5, 4, 3), (8, 5, 4), (12, 6, 5), (3, 8, 6),
    (14, 8, 20), (7, 19, 20), (2, 19, 7), (9, 2, 7), (4, 1, 2),
    (10, 7, 32), (6, 32, 31), (15, 32, 34), (13, 31, 7), (1, 34, 31),
    (8, 19, 21), (11, 21, 20), (7, 29, 8), (2, 29, 30), (5, 33, 29),
    (14, 8, 30), (6, 30, 33), (12, 31, 22), (3, 24, 22), (9, 22, 25),
    (5, 26, 24), (7, 25, 26), (13, 26, 23), (1, 23, 30), (4, 26, 27),
    (8, 27, 28), (2, 23, 28), (10, 11, 12), (15, 13, 14), (12, 16, 15),
    (6, 18, 17)
]

min_tree_edges, min_tree_weight = kruskal_minimum_tree(edges_input)

print('Минимальное покрывающее дерево:')
for edge in min_tree_edges:
    print(f'Вес: {edge[0]}, Вершины: ({edge[1]}, {edge[2]})')

print('Общий вес минимального покрывающего дерева:', min_tree_weight)
```

#### Метод prima_maximum_covering_tree реализует алгоритм Прима для построения максимального покрывающего дерева на основе заданного графа. ####

Класс Graph_1 используется для представления графа, который инициализируется списком рёбер. Каждый элемент рёбер представляет собой кортеж, содержащий вес ребра и узлы, которые оно соединяет.

Параметры: Не имеет параметров, так как использует внутреннее состояние объекта Graph, включающее список рёбер, узлы и другие переменные.

Возвращает:

1. total_weight: Общий вес максимального покрывающего дерева (целое число). 
2. tree_ribs: Список рёбер, входящих в максимальное покрывающее дерево. Каждый элемент списка представляет собой кортеж (узел1, узел2, вес).

Пример использования: 

``` python
from allforgraphs.algorithms.prima_max import prima_maximum_covering_tree

E = [
        (18, 1, 2), (14, 2, 3), (23, 4, 5), (12, 5, 6),
        (16, 1, 6), (28, 6, 8), (24, 8, 9), (3, 9, 10)
    ]
    
    graph = Graph_1(E)
    total_weight, max_tree_ribs = graph.prima_maximum_covering_tree()

    print("Общий вес максимального покрывающего дерева:", total_weight)
    print("Рёбра максимального покрывающего дерева:")
    for u, v, weight in max_tree_ribs:
        print(f"Вес: {weight}, Ребро: ({u}, {v})")
```

#### Метод prima_minimum_covering_tree реализует алгоритм Прима для построения минимального покрывающего дерева. ####

Класс Graph используется для представления графа, который инициализируется списком рёбер. Каждый элемент рёбер представляет собой кортеж, содержащий вес ребра и узлы, которые оно соединяет.

Параметры: Не имеет параметров, так как использует внутреннее состояние объекта Graph_2, включающее список рёбер, узлы и другие переменные.

Возвращает: 
1. total_weight: Общий вес минимального покрывающего дерева (целое число).
2. min_tree_ribs: Список рёбер, входящих в минимальное покрывающее дерево, заданный в формате (узел1, узел2, вес)

Пример использования: 

``` python
from allforgraphs.algorithms.prima_min import prima_minimum_covering_tree

E = [
        (1, 1, 3), (1, 2, 6), (2, 2, 4),
        (3, 1, 5), (4, 3, 4), (5, 4, 5),
        (6, 3, 5), (7, 1, 2), (7, 4, 6)
    ]
    
    graph = Graph_2(E)
    total_weight, min_tree_ribs = graph.prima_minimum_covering_tree()

    print("Общий вес минимального покрывающего дерева:", total_weight)
    print("Рёбра минимального покрывающего дерева:")
    for u, v, weight in min_tree_ribs:
        print(f"Вес: {weight}, Ребро: ({u}, {v})")
```

#### Функция find_eulerian_cycle находит Эйлеров цикл в неориентированном графе, заданном списком рёбер. ####

Параметры:

1. edges: Список рёбер графа, где каждое ребро представлено как кортеж (узел1, узел2).
2. start_vertex: Узел, с которого начинается поиск Эйлерова цикла.

Возвращает:

1. path: Список вершин, представляющий Эйлеров цикл. Если Эйлеров цикл отсутствует, возвращается пустой список.

Пример использования: 

``` python
from allforgraphs.algorithms.euler_gr import find_eulerian_cycle

    edges = [
        (1, 2), (1, 5), (1, 7), (1, 4), (2, 3),
        (2, 5), (2, 6), (4, 5), (5, 6), (5, 7),
        (5, 8), (6, 7), (7, 8), (6, 8), (6, 9),
        (6, 3), (8, 9)
    ]

    start_vertex = 5

    cycle = find_eulerian_cycle(edges, start_vertex)
    print("Эйлеров цикл:", cycle)
```

### Matrices Module ###

##### Функция build_incidence_matrix(edges) строит матрицу инцидентности для графа, заданного списком рёбер. ####

Параметры:

1. edges: список рёбер графа в формате (weight, node1, node2), где weight — это вес ребра, а node1 и node2 — вершины, соединённые этим ребром.

Возвращает:
Матрицу инцидентности в виде списка списков. Если список рёбер пуст, возвращает None.


Пример использования:

``` python
from allforgraphs.matrices.matr_sm import build_incidence_matrix

edges = [
    (5, 1, 2),
    (0, 1, 3),
    (4, 2, 3),
    (3, 3, 4),
    (2, 4, 1),
    (0, 2, 4)
]

incidence_matrix = build_incidence_matrix(edges)

if incidence_matrix:
    print("Матрица инцидентности:")
    print(incidence_matrix)
else:
    print("Список рёбер пуст.")
```

#### Функция build_adjacency_matrix(edges) строит матрицу смежности для графа, заданного списком рёбер. ####

Параметры:

1. edges: список рёбер графа в формате (weight, node1, node2), где weight — это вес ребра, а node1 и node2 — вершины, соединённые этим ребром.

Возвращает:
Матрицу смежности в виде списка списков. Если список рёбер пуст или не содержит рёбер с ненулевым весом, возвращает None.

Пример использования: 

``` python
from allforgraphs.matrices.matr_sm import build_adjacency_matrix

edges = [
    (5, 1, 2),
    (0, 1, 3),
    (4, 2, 3),
    (3, 3, 4),
    (2, 4, 1),
    (0, 2, 4)
]

adjacency_matrix = build_adjacency_matrix(edges)

if adjacency_matrix:
    print("Матрица смежности:")
    print(adjacency_matrix)
else:
    print("Список рёбер пуст.")
```

#### Функция build_weight_matrix(edges) строит матрицу весов для графа, заданного списком рёбер. ####

Параметры:

1. edges: список рёбер графа в формате (weight, node1, node2), где weight — это вес ребра, а node1 и node2 — вершины, соединённые этим ребром.

Возвращает:
Матрицу весов в виде списка списков. Если список рёбер пуст, возвращает None. Веса, отсутствующие в графе, инициализируются значением бесконечности (inf). Для диаметрических рёбер диагональные элементы устанавливаются в 0.

Пример использования: 

``` python
from allforgraphs.matrices.matr_sm import build_weight_matrix

edges = [
    (5, 1, 2),
    (10, 1, 3),
    (0, 2, 3),
    (7, 3, 4),
    (2, 4, 1),
    (3, 2, 4)
]

weight_matrix = build_weight_matrix(edges)

if weight_matrix:
    print("Матрица весов:")
    print(weight_matrix)
else:
    print("Список рёбер пуст.")
```

#### Функция transitive_closure(edges, num_vertices) вычисляет матрицу транзитивного замыкания для графа, заданного списком рёбер. ####

Параметры:

1. edges: список рёбер графа в формате (weight, node1, node2), где weight — это вес ребра, а node1 и node2 — вершины, соединённые этим ребром.
2. num_vertices: общее количество вершин в графе.

Возвращает:
Матрицу транзитивного замыкания в виде списка списков, где значение 1 указывает на наличие пути между вершинами, а 0 — на отсутствие пути.

Пример использования: 

``` python
from allforgraphs.matrices.matr_sm import transitive_closure

edges_input = [
    (5, 1, 2), (4, 2, 4), (4, 2, 3), (7, 3, 1)
]

num_vertices = max(max(i, j) for _, i, j in edges_input)

closure_matrix = transitive_closure(edges_input, num_vertices)

print("Матрица транзитивного замыкания:")
for row in closure_matrix:
    print(" ".join(map(str, row)))
```

#### Функция floyd_warshall(edges, num_vertices) реализует алгоритм Флойда-Уоршелла для нахождения кратчайших расстояний между всеми парами вершин в графе. ####

Параметры:

1. edges: список рёбер графа в формате (weight, node1, node2), где weight — это вес ребра, а node1 и node2 — вершины, соединённые этим ребром.
2. num_vertices: общее количество вершин в графе.

Возвращает:
Матрицу расстояний в виде списка списков, где значение на позиции [i][j] представляет кратчайшее расстояние от вершины i до вершины j. Если путь отсутствует, значение будет равно float('inf').

Пример использования: 

``` python
from allforgraphs.matrices.matr_sm import floyd_warshall

edges_input = [
    (2, 1, 2), (1, 2, 3), (6, 2, 3), (1, 3, 1), (5, 1, 3)
]

num_vertices = max(max(i, j) for _, i, j in edges_input)
shortest_paths_matrix = floyd_warshall(edges_input, num_vertices)

print("Матрица кратчайших расстояний:")
for row in shortest_paths_matrix:
    print(" ".join(map(lambda x: f"{x:5}" if x != float('inf') else " INF", row)))
```

## Developers ##

Авторы библиотеки: Бызова Мария, Верниковская Екатерина, Ольга Калашникова. 

GitHub Бызовой Марии: [link](https://github.com/mobyzova)

GitHub Верниковской Екатерины: [link](https://github.com/Katerok27153)

GitHub Калашниковой Ольги: [link](https://github.com/lacrimell)

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Katerok27153/allforgraphs.git",
    "name": "allforgraphs",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "files speedfiles",
    "author": "katya,maria,olga",
    "author_email": "1132236136@pfur.ru",
    "download_url": "https://files.pythonhosted.org/packages/a5/19/5ba348df1add27f5fe308855632dbf0843a18dbeb911c5e9aed5d82f34e3/allforgraphs-1.0.1.tar.gz",
    "platform": null,
    "description": "# allforgraphs Library #\n\n## What is this? ##\nallforgraphs \u2013 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0440\u0430\u0444\u0430\u043c\u0438 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446. \u041e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0434\u0432\u0430 \u043c\u043e\u0434\u0443\u043b\u044f: \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0441 \u0433\u0440\u0430\u0444\u0430\u043c\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0440\u0438\u0446.\n\n## Quick Guide ##\n### \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 ###\n\nallforgraphs \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439:\n\n1. algorithms - \u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438 \u0433\u0440\u0430\u0444\u0430.\n2. matrices - \u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0433\u0440\u0430\u0444\u0430\u043c\u0438.\n\n## Installation ## \n\n\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 allforgraphs, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0435\u0451 \u0447\u0435\u0440\u0435\u0437 pip:\n\n```pip install allforgraphs```\n\n\n## Using ##\n\n\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e:\n\n``` python\nfrom allforgraphs import *\n```\n\n## Modules Overview ##\n\n### Algorithms Module ###\n\n#### \u0424\u0443\u043d\u043a\u0446\u0438\u044f find_shortest_path(edges_input, start_node, end_node) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0439 \u043f\u0443\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0437\u043b\u0430\u043c\u0438 \u0432 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0414\u0435\u0439\u043a\u0441\u0442\u0440\u044b. #####\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\n\n1. edges_input: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u0433\u0440\u0430\u0444\u0430, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0440\u0435\u0431\u0440\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u043c (weight, node1, node2), \u0433\u0434\u0435 weight \u2014 \u044d\u0442\u043e \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430, \u0430 node1 \u0438 node2 \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c \u0440\u0435\u0431\u0440\u043e\u043c.\n2. start_node: \u0443\u0437\u0435\u043b, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0433\u043e \u043f\u0443\u0442\u0438.\n3. end_node: \u0443\u0437\u0435\u043b, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u0443\u0442\u044c.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n\u041a\u043e\u0440\u0442\u0435\u0436, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0441\u0430\u043c \u043f\u0443\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u0437\u043b\u043e\u0432.\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \n\n``` python\nfrom allforgraphs.algorithms.dr import find_shortest_path\n\nedges_input = [\n    (11, 3, 1), (5, 4, 3), (8, 5, 4), (12, 6, 5), (3, 8, 6), \n    (14, 8, 20), (7, 19, 20), (2, 19, 7), (9, 2, 7), (4, 1, 2),\n    (10, 7, 32), (6, 32, 31), (15, 32, 34), (13, 31, 7), \n    (1, 34, 31), (8, 19, 21), (11, 21, 20), (7, 29, 8), \n    (2, 29, 30), (5, 33, 29), (14, 8, 30), (6, 30, 33), \n    (12, 31, 22), (3, 24, 22), (9, 22, 25), (5, 26, 24), \n    (7, 25, 26), (13, 26, 23), (1, 23, 30), (4, 26, 27), \n    (8, 27, 28), (2, 23, 28), (10, 11, 12), (15, 13, 14), \n    (12, 16, 15), (6, 18, 17)\n]\nstart_node = 34\nend_node = 8\n\ndistance, path = find_shortest_path(edges_input, start_node, end_node)\nprint(f\"\u041a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 {start_node} \u0434\u043e {end_node}: {distance}\")\nprint(f\"\u041f\u0443\u0442\u044c: {' -> '.join(map(str, path))}\")\n```\n\n#### \u0424\u0443\u043d\u043a\u0446\u0438\u044f kruskal_maximum_tree(edges_input) \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u041a\u0440\u0430\u0441\u043a\u0430\u043b\u0430 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u0433\u0440\u0430\u0444\u0435 ####\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\n\n1. edges_input: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (weight, node1, node2), \u0433\u0434\u0435 weight \u2014 \u044d\u0442\u043e \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430, \u0430 node1 \u0438 node2 \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c \u0440\u0435\u0431\u0440\u043e\u043c.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n\u041a\u043e\u0440\u0442\u0435\u0436, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u0435\u0433\u043e \u043e\u0431\u0449\u0438\u0439 \u0432\u0435\u0441.\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \n\n``` python\nfrom allforgraphs.algorithms.kr_max import kruskal_maximum_tree\n\nedges_input = [\n    (9, 0, 1), (12, 0, 2), (10, 1, 2), (15, 1, 3),\n    (5, 2, 3), (20, 2, 4), (25, 3, 4), (30, 4, 5)\n]\n\nmax_tree_edges, max_tree_weight = kruskal_maximum_tree(edges_input)\n\nprint('\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e:')\nfor edge in max_tree_edges:\n    print(f'\u0412\u0435\u0441: {edge[0]}, \u0412\u0435\u0440\u0448\u0438\u043d\u044b: ({edge[1]}, {edge[2]})')\n\nprint('\u041e\u0431\u0449\u0438\u0439 \u0432\u0435\u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430:', max_tree_weight)\n```\n\n#### \u0424\u0443\u043d\u043a\u0446\u0438\u044f kruskal_minimum_tree(edges_input) \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u041a\u0440\u0430\u0441\u043a\u0430\u043b\u0430 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u0433\u0440\u0430\u0444\u0435. ####\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\n\n1. edges_input: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (weight, node1, node2), \u0433\u0434\u0435 weight \u2014 \u044d\u0442\u043e \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430, \u0430 node1 \u0438 node2 \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c \u0440\u0435\u0431\u0440\u043e\u043c.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n\u041a\u043e\u0440\u0442\u0435\u0436, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u0435\u0433\u043e \u043e\u0431\u0449\u0438\u0439 \u0432\u0435\u0441.\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \n\n``` python\nfrom allforgraphs.algorithms.kr_min import kruskal_minimum_tree\n\nedges_input = [\n    (11, 3, 1), (5, 4, 3), (8, 5, 4), (12, 6, 5), (3, 8, 6),\n    (14, 8, 20), (7, 19, 20), (2, 19, 7), (9, 2, 7), (4, 1, 2),\n    (10, 7, 32), (6, 32, 31), (15, 32, 34), (13, 31, 7), (1, 34, 31),\n    (8, 19, 21), (11, 21, 20), (7, 29, 8), (2, 29, 30), (5, 33, 29),\n    (14, 8, 30), (6, 30, 33), (12, 31, 22), (3, 24, 22), (9, 22, 25),\n    (5, 26, 24), (7, 25, 26), (13, 26, 23), (1, 23, 30), (4, 26, 27),\n    (8, 27, 28), (2, 23, 28), (10, 11, 12), (15, 13, 14), (12, 16, 15),\n    (6, 18, 17)\n]\n\nmin_tree_edges, min_tree_weight = kruskal_minimum_tree(edges_input)\n\nprint('\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e:')\nfor edge in min_tree_edges:\n    print(f'\u0412\u0435\u0441: {edge[0]}, \u0412\u0435\u0440\u0448\u0438\u043d\u044b: ({edge[1]}, {edge[2]})')\n\nprint('\u041e\u0431\u0449\u0438\u0439 \u0432\u0435\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430:', min_tree_weight)\n```\n\n#### \u041c\u0435\u0442\u043e\u0434 prima_maximum_covering_tree \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u041f\u0440\u0438\u043c\u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430. ####\n\n\u041a\u043b\u0430\u0441\u0441 Graph_1 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0451\u0431\u0435\u0440. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0451\u0431\u0435\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u0440\u0442\u0435\u0436, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430 \u0438 \u0443\u0437\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442.\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: \u041d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Graph, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440, \u0443\u0437\u043b\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n\n1. total_weight: \u041e\u0431\u0449\u0438\u0439 \u0432\u0435\u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 (\u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e). \n2. tree_ribs: \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440, \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0432 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u0440\u0442\u0435\u0436 (\u0443\u0437\u0435\u043b1, \u0443\u0437\u0435\u043b2, \u0432\u0435\u0441).\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \n\n``` python\nfrom allforgraphs.algorithms.prima_max import prima_maximum_covering_tree\n\nE = [\n        (18, 1, 2), (14, 2, 3), (23, 4, 5), (12, 5, 6),\n        (16, 1, 6), (28, 6, 8), (24, 8, 9), (3, 9, 10)\n    ]\n    \n    graph = Graph_1(E)\n    total_weight, max_tree_ribs = graph.prima_maximum_covering_tree()\n\n    print(\"\u041e\u0431\u0449\u0438\u0439 \u0432\u0435\u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430:\", total_weight)\n    print(\"\u0420\u0451\u0431\u0440\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430:\")\n    for u, v, weight in max_tree_ribs:\n        print(f\"\u0412\u0435\u0441: {weight}, \u0420\u0435\u0431\u0440\u043e: ({u}, {v})\")\n```\n\n#### \u041c\u0435\u0442\u043e\u0434 prima_minimum_covering_tree \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u041f\u0440\u0438\u043c\u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430. ####\n\n\u041a\u043b\u0430\u0441\u0441 Graph \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0451\u0431\u0435\u0440. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0451\u0431\u0435\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u0440\u0442\u0435\u0436, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430 \u0438 \u0443\u0437\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442.\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: \u041d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Graph_2, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440, \u0443\u0437\u043b\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442: \n1. total_weight: \u041e\u0431\u0449\u0438\u0439 \u0432\u0435\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 (\u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e).\n2. min_tree_ribs: \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440, \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (\u0443\u0437\u0435\u043b1, \u0443\u0437\u0435\u043b2, \u0432\u0435\u0441)\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \n\n``` python\nfrom allforgraphs.algorithms.prima_min import prima_minimum_covering_tree\n\nE = [\n        (1, 1, 3), (1, 2, 6), (2, 2, 4),\n        (3, 1, 5), (4, 3, 4), (5, 4, 5),\n        (6, 3, 5), (7, 1, 2), (7, 4, 6)\n    ]\n    \n    graph = Graph_2(E)\n    total_weight, min_tree_ribs = graph.prima_minimum_covering_tree()\n\n    print(\"\u041e\u0431\u0449\u0438\u0439 \u0432\u0435\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430:\", total_weight)\n    print(\"\u0420\u0451\u0431\u0440\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430:\")\n    for u, v, weight in min_tree_ribs:\n        print(f\"\u0412\u0435\u0441: {weight}, \u0420\u0435\u0431\u0440\u043e: ({u}, {v})\")\n```\n\n#### \u0424\u0443\u043d\u043a\u0446\u0438\u044f find_eulerian_cycle \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u042d\u0439\u043b\u0435\u0440\u043e\u0432 \u0446\u0438\u043a\u043b \u0432 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0451\u0431\u0435\u0440. ####\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\n\n1. edges: \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u0433\u0440\u0430\u0444\u0430, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0440\u0435\u0431\u0440\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u043a\u0430\u043a \u043a\u043e\u0440\u0442\u0435\u0436 (\u0443\u0437\u0435\u043b1, \u0443\u0437\u0435\u043b2).\n2. start_vertex: \u0423\u0437\u0435\u043b, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u042d\u0439\u043b\u0435\u0440\u043e\u0432\u0430 \u0446\u0438\u043a\u043b\u0430.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n\n1. path: \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u042d\u0439\u043b\u0435\u0440\u043e\u0432 \u0446\u0438\u043a\u043b. \u0415\u0441\u043b\u0438 \u042d\u0439\u043b\u0435\u0440\u043e\u0432 \u0446\u0438\u043a\u043b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \n\n``` python\nfrom allforgraphs.algorithms.euler_gr import find_eulerian_cycle\n\n    edges = [\n        (1, 2), (1, 5), (1, 7), (1, 4), (2, 3),\n        (2, 5), (2, 6), (4, 5), (5, 6), (5, 7),\n        (5, 8), (6, 7), (7, 8), (6, 8), (6, 9),\n        (6, 3), (8, 9)\n    ]\n\n    start_vertex = 5\n\n    cycle = find_eulerian_cycle(edges, start_vertex)\n    print(\"\u042d\u0439\u043b\u0435\u0440\u043e\u0432 \u0446\u0438\u043a\u043b:\", cycle)\n```\n\n### Matrices Module ###\n\n##### \u0424\u0443\u043d\u043a\u0446\u0438\u044f build_incidence_matrix(edges) \u0441\u0442\u0440\u043e\u0438\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0430, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0451\u0431\u0435\u0440. ####\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\n\n1. edges: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (weight, node1, node2), \u0433\u0434\u0435 weight \u2014 \u044d\u0442\u043e \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430, \u0430 node1 \u0438 node2 \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c \u0440\u0435\u0431\u0440\u043e\u043c.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n\u041c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u043f\u0443\u0441\u0442, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 None.\n\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:\n\n``` python\nfrom allforgraphs.matrices.matr_sm import build_incidence_matrix\n\nedges = [\n    (5, 1, 2),\n    (0, 1, 3),\n    (4, 2, 3),\n    (3, 3, 4),\n    (2, 4, 1),\n    (0, 2, 4)\n]\n\nincidence_matrix = build_incidence_matrix(edges)\n\nif incidence_matrix:\n    print(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438:\")\n    print(incidence_matrix)\nelse:\n    print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u043f\u0443\u0441\u0442.\")\n```\n\n#### \u0424\u0443\u043d\u043a\u0446\u0438\u044f build_adjacency_matrix(edges) \u0441\u0442\u0440\u043e\u0438\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0430, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0451\u0431\u0435\u0440. ####\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\n\n1. edges: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (weight, node1, node2), \u0433\u0434\u0435 weight \u2014 \u044d\u0442\u043e \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430, \u0430 node1 \u0438 node2 \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c \u0440\u0435\u0431\u0440\u043e\u043c.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n\u041c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u043f\u0443\u0441\u0442 \u0438\u043b\u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0451\u0431\u0435\u0440 \u0441 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0432\u0435\u0441\u043e\u043c, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 None.\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \n\n``` python\nfrom allforgraphs.matrices.matr_sm import build_adjacency_matrix\n\nedges = [\n    (5, 1, 2),\n    (0, 1, 3),\n    (4, 2, 3),\n    (3, 3, 4),\n    (2, 4, 1),\n    (0, 2, 4)\n]\n\nadjacency_matrix = build_adjacency_matrix(edges)\n\nif adjacency_matrix:\n    print(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438:\")\n    print(adjacency_matrix)\nelse:\n    print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u043f\u0443\u0441\u0442.\")\n```\n\n#### \u0424\u0443\u043d\u043a\u0446\u0438\u044f build_weight_matrix(edges) \u0441\u0442\u0440\u043e\u0438\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0432\u0435\u0441\u043e\u0432 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0430, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0451\u0431\u0435\u0440. ####\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\n\n1. edges: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (weight, node1, node2), \u0433\u0434\u0435 weight \u2014 \u044d\u0442\u043e \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430, \u0430 node1 \u0438 node2 \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c \u0440\u0435\u0431\u0440\u043e\u043c.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n\u041c\u0430\u0442\u0440\u0438\u0446\u0443 \u0432\u0435\u0441\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u043f\u0443\u0441\u0442, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 None. \u0412\u0435\u0441\u0430, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 \u0433\u0440\u0430\u0444\u0435, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 (inf). \u0414\u043b\u044f \u0434\u0438\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0451\u0431\u0435\u0440 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 0.\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \n\n``` python\nfrom allforgraphs.matrices.matr_sm import build_weight_matrix\n\nedges = [\n    (5, 1, 2),\n    (10, 1, 3),\n    (0, 2, 3),\n    (7, 3, 4),\n    (2, 4, 1),\n    (3, 2, 4)\n]\n\nweight_matrix = build_weight_matrix(edges)\n\nif weight_matrix:\n    print(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432\u0435\u0441\u043e\u0432:\")\n    print(weight_matrix)\nelse:\n    print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u043f\u0443\u0441\u0442.\")\n```\n\n#### \u0424\u0443\u043d\u043a\u0446\u0438\u044f transitive_closure(edges, num_vertices) \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0430, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0451\u0431\u0435\u0440. ####\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\n\n1. edges: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (weight, node1, node2), \u0433\u0434\u0435 weight \u2014 \u044d\u0442\u043e \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430, \u0430 node1 \u0438 node2 \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c \u0440\u0435\u0431\u0440\u043e\u043c.\n2. num_vertices: \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u0448\u0438\u043d \u0432 \u0433\u0440\u0430\u0444\u0435.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n\u041c\u0430\u0442\u0440\u0438\u0446\u0443 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0433\u0434\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0443\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438, \u0430 0 \u2014 \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0443\u0442\u0438.\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \n\n``` python\nfrom allforgraphs.matrices.matr_sm import transitive_closure\n\nedges_input = [\n    (5, 1, 2), (4, 2, 4), (4, 2, 3), (7, 3, 1)\n]\n\nnum_vertices = max(max(i, j) for _, i, j in edges_input)\n\nclosure_matrix = transitive_closure(edges_input, num_vertices)\n\nprint(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f:\")\nfor row in closure_matrix:\n    print(\" \".join(map(str, row)))\n```\n\n#### \u0424\u0443\u043d\u043a\u0446\u0438\u044f floyd_warshall(edges, num_vertices) \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0424\u043b\u043e\u0439\u0434\u0430-\u0423\u043e\u0440\u0448\u0435\u043b\u043b\u0430 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0438 \u0432\u0435\u0440\u0448\u0438\u043d \u0432 \u0433\u0440\u0430\u0444\u0435. ####\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\n\n1. edges: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (weight, node1, node2), \u0433\u0434\u0435 weight \u2014 \u044d\u0442\u043e \u0432\u0435\u0441 \u0440\u0435\u0431\u0440\u0430, \u0430 node1 \u0438 node2 \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c \u0440\u0435\u0431\u0440\u043e\u043c.\n2. num_vertices: \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u0448\u0438\u043d \u0432 \u0433\u0440\u0430\u0444\u0435.\n\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n\u041c\u0430\u0442\u0440\u0438\u0446\u0443 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0433\u0434\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 [i][j] \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b i \u0434\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b j. \u0415\u0441\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e float('inf').\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \n\n``` python\nfrom allforgraphs.matrices.matr_sm import floyd_warshall\n\nedges_input = [\n    (2, 1, 2), (1, 2, 3), (6, 2, 3), (1, 3, 1), (5, 1, 3)\n]\n\nnum_vertices = max(max(i, j) for _, i, j in edges_input)\nshortest_paths_matrix = floyd_warshall(edges_input, num_vertices)\n\nprint(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439:\")\nfor row in shortest_paths_matrix:\n    print(\" \".join(map(lambda x: f\"{x:5}\" if x != float('inf') else \" INF\", row)))\n```\n\n## Developers ##\n\n\u0410\u0432\u0442\u043e\u0440\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: \u0411\u044b\u0437\u043e\u0432\u0430 \u041c\u0430\u0440\u0438\u044f, \u0412\u0435\u0440\u043d\u0438\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u0415\u043a\u0430\u0442\u0435\u0440\u0438\u043d\u0430, \u041e\u043b\u044c\u0433\u0430 \u041a\u0430\u043b\u0430\u0448\u043d\u0438\u043a\u043e\u0432\u0430. \n\nGitHub \u0411\u044b\u0437\u043e\u0432\u043e\u0439 \u041c\u0430\u0440\u0438\u0438: [link](https://github.com/mobyzova)\n\nGitHub \u0412\u0435\u0440\u043d\u0438\u043a\u043e\u0432\u0441\u043a\u043e\u0439 \u0415\u043a\u0430\u0442\u0435\u0440\u0438\u043d\u044b: [link](https://github.com/Katerok27153)\n\nGitHub \u041a\u0430\u043b\u0430\u0448\u043d\u0438\u043a\u043e\u0432\u043e\u0439 \u041e\u043b\u044c\u0433\u0438: [link](https://github.com/lacrimell)\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Library for graphs.",
    "version": "1.0.1",
    "project_urls": {
        "GitHub": "https://github.com/Katerok27153/allforgraphs.git",
        "Homepage": "https://github.com/Katerok27153/allforgraphs.git"
    },
    "split_keywords": [
        "files",
        "speedfiles"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "428a0b85a34d44ab6ee93a39cee84c4910a9475c9bb84be543ed08d32d1f5236",
                "md5": "74ca8d18b38b911c272c0ea7bf1df06f",
                "sha256": "2a35feed4cd0643fba418d9d3744c2adef596623a65692bae7a9ae3693df627b"
            },
            "downloads": -1,
            "filename": "allforgraphs-1.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "74ca8d18b38b911c272c0ea7bf1df06f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 18377,
            "upload_time": "2024-12-19T17:38:28",
            "upload_time_iso_8601": "2024-12-19T17:38:28.084132Z",
            "url": "https://files.pythonhosted.org/packages/42/8a/0b85a34d44ab6ee93a39cee84c4910a9475c9bb84be543ed08d32d1f5236/allforgraphs-1.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a5195ba348df1add27f5fe308855632dbf0843a18dbeb911c5e9aed5d82f34e3",
                "md5": "d855f269bdf1315b449c7cb6d2d53f05",
                "sha256": "f9310885b96183a9df27d6aee7ca0aa015d4e18d91e8d577f47849454af8f044"
            },
            "downloads": -1,
            "filename": "allforgraphs-1.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "d855f269bdf1315b449c7cb6d2d53f05",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 17499,
            "upload_time": "2024-12-19T17:38:29",
            "upload_time_iso_8601": "2024-12-19T17:38:29.569686Z",
            "url": "https://files.pythonhosted.org/packages/a5/19/5ba348df1add27f5fe308855632dbf0843a18dbeb911c5e9aed5d82f34e3/allforgraphs-1.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-12-19 17:38:29",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Katerok27153",
    "github_project": "allforgraphs",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "allforgraphs"
}
        
Elapsed time: 0.43715s