forked from exarus/GraphWays
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathalgorythms.h
148 lines (136 loc) · 8.27 KB
/
algorythms.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// algorythms.h - заголовок з функціями для пошуку найкоротших шляхів
// у орієнтованому графі
#ifndef ALGORYTHMS_H
#define ALGORYTHMS_H
// ================= ПРОТОТИПИ ФУНКЦІЙ АЛГОРИТМІВ ======================
/**
* @brief shortestPathsByFloyd
* Пошук найкоротших шляхів у графі за алгоритмом Флойда-Уоршелла.
* Алгоритм модифікований для пошуку найкоротших шляхів
* навіть при присутності у графі циклів з від'ємною вагою.
* Повертає матрицю найкоротших відстаней та записує матрицю відновлення
* шляху у змінну renewMatrix.
*
* @param D0 - матриця відстаней (що зберігає усі ваги ребер у графі)
* @param n - розмір матриці відстаней (кількість вершин у графі)
* @param renewMatrix - змінна у яку запишеться матриця відновлення шляху
* @return матрицу кратчайших путей
* (без учета циклов с отрицательными весами)
*/
int **shortestPathsByFloyd(int **D0, int n, int **&renewMatrix);
/**
* @brief shortestPathsByDantzig
* Пошук найкоротших шляхів у графі за алгоритмом Данцига.
* Алгоритм модифікований для пошуку найкоротших шляхів навіть при
* присутності у графі циклів з від'ємною вагою.
* Повертає матрицю найкоротших відстаней та записує матрицю відновлення
* шляху у змінну renewMatrix.
*
* @param D0 - матриця відстаней (що зберігає усі ваги ребер у графі)
* @param n - розмір матриці відстаней (кількість вершин у графі)
* @param renewMatrix - змінна у яку запишеться матриця відновлення шляху
* @return матрицу кратчайших путей
* (без учета циклов с отрицательными весами)
*/
int **shortestPathsByDantzig(int **D0, int n, int **&renewMatrix);
/**
* @brief shortestPathsByFloydWithoutNegativeLoopCheck
*
* Функція знаходить найкоротші шляхи у графі, що заданий матрицею
* відстаней та кількістю ребер у ній за алгоритмом Флойда-Уоршелла.
* Повертає матрицю найкоротших відстаней та записує матрицю відновлення
* шляху у змінну renewMatrix.
*
* @param D0 - матриця відстаней (що зберігає усі ваги ребер у графі)
* @param n - розмір матриці відстаней (кількість вершин у графі)
* @param renewMatrix - змінна у яку запишеться матриця відновлення шляху
* @return матрицю найкоротших відстаней
*/
int **shortestPathsByFloydWithoutNegativeLoopCheck(int **D0, int n,
int **&renewMatrix);
/**
* @brief shortestPathsByFloydWithoutNegativeLoopCheck
*
* Функція знаходить найкоротші шляхи у графі, що заданий матрицею
* відстаней та кількістю ребер у ній за алгоритмом Данцига.
* Повертає матрицю найкоротших відстаней та записує матрицю відновлення
* шляху у змінну renewMatrix.
*
* @param D0 - матриця відстаней (що зберігає усі ваги ребер у графі)
* @param n - розмір матриці відстаней (кількість вершин у графі)
* @param renewMatrix - змінна у яку запишеться матриця відновлення шляху
* @return матрицю найкоротших відстаней
*/
int **shortestPathsByDantzigWithoutNegativeLoopCheck(int **D0, int n,
int **&renewMatrix);
/**
* @brief negativeLoopCheck
*
* Оглядає матрицю найкоротших відстаней отриману,
* наприклад, алгоритмами Флойда-Уоршелла або Данцига
* та проводить обробку циклів з негативними вагами.
* У разі їх відстуності вхідна матриця не змінюється.
* Повертає оброблену матрицю відстаней, в якій знайдені
* та правильним чином оброблені цикли з негативними вагами.
*
* @param D матриця найкоротших відстаней
* @param n кількість вершин у графі
* @return обработаную матрицу кратчайших
* расстояний, которая учитывает негативные циклы.
*/
int **negativeLoopCheck(int **D, int n);
/**
* @brief sum
*
* Виконує додавання двох чисел, враховуючи можливість переповнення
* розрядної сітки. У випадку, якщо сума чисел перевищує максимальне
* можливе число для 32-бітної розрядної сітки, то функція повертає
* останнє. У разі додавання, результатом якого є число, що менше за
* мінімальне для 32-бітної розрядної сітки, функція повертає останнє.
*
*
* @param operand1 перший доданок
* @param operand2 другий доданок
* @return суму двох чисел.
*/
int sum(int operand1, int operand2);
/**
* @brief copyOf
* Повертає копію квадратної матриці matrix
* порядку (size)x(size).
*
* @param matrix матриця, яку копіює функція
* @param size розмір цієї матриці
* @return копії матриці matrix
*/
int **copyOf(int **matrix, int size);
/**
* @brief relaxPath
*
* Намагається релаксувати шлях у матриці з from до to, спробою
* прокласти шлях через вершину through. Тобто, якщо сума шляхів
* з from до through та з through до to менша за поточний
* шлях з from до to, то замінюємо останній на цю суму.
* В результаті замінює елемент матриці, що відповідає
* відстані, яку релаксує функція.
*
* @param from - вершина, звідки прокладається відстань у графі
* @param through - вершина, через яку, можливо, проходитиме новий шлях
* @param to - вершина, до якої прокладається шлях
* @param D - матриця відстаней графу, що розглядається
* @param P - матриця відновлення шляхів у графі
*/
void relaxPath(int from, int through, int to, int **D, int **&P);
/**
* @brief prepareRenewMatrix
*
* Підготовлення матриці відновлення для заповнення
* у ході алгоритму пошуку найкоротших шляхів.
*
* @param renewMatrix матриця відновлення, що буде заповнюватись
* @param size порядок матриці відновлення.
* @return матрицю відновлення, що готова для запису у ході алгоритмів
* пошуку найкоротшого шляху.
*/
int **prepareRenewMatrix(int **&renewMatrix, int size);
#endif // ALGORYTHMS_H