From 5175d151948b0a02b6ced2c57c6064e22cb062aa Mon Sep 17 00:00:00 2001 From: lnd212 Date: Wed, 24 Nov 2021 21:35:55 +0400 Subject: [PATCH] final1 --- tex/dart/graph/bfs.dart | 52 +++++++++ tex/dart/graph/dfs.dart | 19 ++++ tex/dart/graph/dijkstra.dart | 29 +++++ tex/dart/graph/dot.dart | 6 + tex/dart/graph/dot_constr.dart | 24 ++++ tex/dart/graph/dot_manip.dart | 5 + tex/dart/graph/graph.dart | 6 + tex/dart/graph/kruscal.dart | 28 +++++ tex/dart/page/build.dart | 58 ++++++++++ tex/dart/page/button.dart | 14 +++ tex/dart/painter/arrow.dart | 22 ++++ tex/dart/painter/constr.dart | 9 ++ tex/dart/painter/pos.dart | 24 ++++ tex/dart/pseudoDijkstra.txt | 9 ++ tex/dart/pseudoKruscal.txt | 10 ++ tex/example-work.tex | 187 ++++++++++++++++++++++++-------- tex/example-work.toc | 37 ++++--- tex/lib/pages/drawing_page.dart | 1 - tex/lib/src/curve_painter.dart | 3 +- tex/lib/src/graph.dart | 23 +--- tex/pic/grafs.png | Bin 0 -> 28630 bytes tex/pic/result.png | Bin 0 -> 47306 bytes tex/thesis.bib | 10 ++ 23 files changed, 496 insertions(+), 80 deletions(-) create mode 100644 tex/dart/graph/bfs.dart create mode 100644 tex/dart/graph/dfs.dart create mode 100644 tex/dart/graph/dijkstra.dart create mode 100644 tex/dart/graph/dot.dart create mode 100644 tex/dart/graph/dot_constr.dart create mode 100644 tex/dart/graph/dot_manip.dart create mode 100644 tex/dart/graph/graph.dart create mode 100644 tex/dart/graph/kruscal.dart create mode 100644 tex/dart/page/build.dart create mode 100644 tex/dart/page/button.dart create mode 100644 tex/dart/painter/arrow.dart create mode 100644 tex/dart/painter/constr.dart create mode 100644 tex/dart/painter/pos.dart create mode 100644 tex/dart/pseudoDijkstra.txt create mode 100644 tex/dart/pseudoKruscal.txt create mode 100644 tex/pic/grafs.png create mode 100644 tex/pic/result.png diff --git a/tex/dart/graph/bfs.dart b/tex/dart/graph/bfs.dart new file mode 100644 index 0000000..b2fd7c3 --- /dev/null +++ b/tex/dart/graph/bfs.dart @@ -0,0 +1,52 @@ +List? bfsPath(int startDot, int goalDot) { + if (startDot == goalDot) return [startDot]; + startDot--; + goalDot--; + List>? graph = getLenTable(); + List used = []; + List dst = []; + List pr = []; + + for (int i = 0; i < _amount; i++) { + dst.add(-1); + used.add(false); + pr.add(0); + } + + List q = []; + q.add(startDot); + used[startDot] = true; + dst[startDot] = 0; + pr[startDot] = -1; //у вершины нет предыдущей. + + while (q.isNotEmpty) { + int cur = q.removeAt(0); + int x = 0; + for (int neighbor in graph![cur]) { + if (neighbor != -1) { + if (!used[x]) { + q.add(x); + used[x] = true; + dst[x] = dst[cur] + 1; + pr[x] = cur; //сохранение предыдущей вершины + } + } + x++; + } + } + + //Восстановление кратчайшиего путьи + List path = []; + int cur = goalDot; + path.add(cur + 1); + while (pr[cur] != -1) { + cur = pr[cur]; + path.add(cur + 1); + } + + path = path.reversed.toList(); + if (path[0] == (startDot + 1) && + path[1] == (goalDot + 1) && + !_dots[startDot].hasConnection(goalDot + 1)) return null; + return path; + } \ No newline at end of file diff --git a/tex/dart/graph/dfs.dart b/tex/dart/graph/dfs.dart new file mode 100644 index 0000000..c9db34c --- /dev/null +++ b/tex/dart/graph/dfs.dart @@ -0,0 +1,19 @@ +List? dfsIterative(int v) { + v--; + List label = []; + for (int i = 0; i < _amount; i++) { + label.add(false); + } + List stack = []; + stack.add(v); + while (stack.isNotEmpty) { + v = stack.removeLast(); + if (!label[v]) { + label[v] = true; + for (int i in _dots[v].getL().keys) { + stack.add(i - 1); + } + } + } + return label; + } \ No newline at end of file diff --git a/tex/dart/graph/dijkstra.dart b/tex/dart/graph/dijkstra.dart new file mode 100644 index 0000000..55f5c9e --- /dev/null +++ b/tex/dart/graph/dijkstra.dart @@ -0,0 +1,29 @@ +List dijkstra(int from) { + List d = List.filled(_amount, intMax); + List p = List.filled(_amount, -1); + + d[from - 1] = 0; + List u = List.filled(_amount, false); + for (int i = 0; i < _amount; ++i) { + int v = -1; + for (int j = 0; j < _amount; ++j) { + if (!u[j] && (v == -1 || d[j]! < d[v]!)) { + v = j; + } + } + if (d[v] == intMax) break; + u[v] = true; + for (int to in _dots[v].getL().keys) { + int len = _dots[v].getL()[to]!; + if (!_useLength && len == 0) len = 1; + if (d[v]! + len < d[to - 1]!) { + d[to - 1] = d[v]! + len; + p[to - 1] = v; + } + } + } + for (int i = 0; i < d.length; i++) { + if (d[i] == intMax) d[i] = null; + } + return d; + } \ No newline at end of file diff --git a/tex/dart/graph/dot.dart b/tex/dart/graph/dot.dart new file mode 100644 index 0000000..498a81e --- /dev/null +++ b/tex/dart/graph/dot.dart @@ -0,0 +1,6 @@ +class Dot { + //Data + String _name = ""; + int num = -1; + Map _ln = {}; + *** diff --git a/tex/dart/graph/dot_constr.dart b/tex/dart/graph/dot_constr.dart new file mode 100644 index 0000000..87f4f98 --- /dev/null +++ b/tex/dart/graph/dot_constr.dart @@ -0,0 +1,24 @@ +Dot([String name = "Undefined", int n = -1]) { + _name = name; + num = n; + _ln = {}; + } + Dot.fromTwoLists(String name, List num0, List length, + [int n = -1]) { + _name = name; + num = n; + Map nw = {}; + if (num0.length != length.length) { + print("Error in lists"); + } else { + for (var i = 0; i < num0.length; i++) { + nw[num0[i]] = length[i]; + _ln = nw; + } + } + } + Dot.fromMap(String name, Map l, [int n = -1]) { + _name = name; + num = n; + _ln = l; + } \ No newline at end of file diff --git a/tex/dart/graph/dot_manip.dart b/tex/dart/graph/dot_manip.dart new file mode 100644 index 0000000..6d066c4 --- /dev/null +++ b/tex/dart/graph/dot_manip.dart @@ -0,0 +1,5 @@ +void setName(String n) => _name = n; + +void addPath(int inp, int length) => _ln[inp] = length; + +void delPath(int n) => _ln.removeWhere((key, value) => key == n); diff --git a/tex/dart/graph/graph.dart b/tex/dart/graph/graph.dart new file mode 100644 index 0000000..de0f479 --- /dev/null +++ b/tex/dart/graph/graph.dart @@ -0,0 +1,6 @@ +String _name = "Undefined"; //Имя +int _amount = 0; //Количество вершин +List _dots = []; //Список смежности вершин +Map _nameTable = {}; //Список вершин по именам +bool _useLength = false; //Взвешенность +bool _oriented = false; //Ориентированность \ No newline at end of file diff --git a/tex/dart/graph/kruscal.dart b/tex/dart/graph/kruscal.dart new file mode 100644 index 0000000..adecdcc --- /dev/null +++ b/tex/dart/graph/kruscal.dart @@ -0,0 +1,28 @@ +Graphs? kruskal() { + List g = getSortedPathList(); + //int cost = 0; + List res = []; + for (int i = 0; i < _amount; i++) { + res.add(Dot(_dots[i].getName(), _dots[i].num)); + } + List treeId = List.filled(_amount, 0); + for (int i = 0; i < _amount; ++i) { + treeId[i] = i; + } + for (int i = 0; i < g.length; ++i) { + int a = g[i].d - 1, b = g[i].p - 1; + int l = g[i].l; + if (treeId[a] != treeId[b]) { + //cost += l; + res[a].addPath(b + 1, l); + int oldId = treeId[b], newId = treeId[a]; + for (int j = 0; j < _amount; ++j) { + if (treeId[j] == oldId) { + treeId[j] = newId; + } + } + } + } + _dots = res; + return Graphs.fromList(_name, res, _useLength, _oriented); + } \ No newline at end of file diff --git a/tex/dart/page/build.dart b/tex/dart/page/build.dart new file mode 100644 index 0000000..797a264 --- /dev/null +++ b/tex/dart/page/build.dart @@ -0,0 +1,58 @@ +@override + Widget build(BuildContext context) { + screenSize = MediaQuery.of(context).size.width; + _textGrNmController.text = graphData.getName(); + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Align( + alignment: Alignment.topLeft, + child: Text("Graph name:\n", + style: TextStyle( + fontSize: 18, + color: Colors.white, + ))), + toolbarHeight: 110, + flexibleSpace: Container( + color: Colors.green.shade900, + child: Column(children: [ + /* + Описание элементов на панеле приложения + */ + ]), + ), + actions: [ + IconButton( + onPressed: () { + setState(() { + clearDropDownVals(); + graphData.flushData(); + clearInputData(); + }); + }, + icon: const Icon(Icons.delete_sweep), + iconSize: 60, + ), + ]), + body: CustomPaint( + painter: CurvePainter( + graphData: graphData, + intListPath: intListPath, + dfsAccessTable: dfsAccessTable, + start: startDot, + end: endDot, + op: op), + child: Align( + alignment: Alignment.topRight, + child: ButtonBar( + mainAxisSize: MainAxisSize.min, + children: [ + /* + Описание кнопок действия + */ + ], + ), + ), + ), + )); + } \ No newline at end of file diff --git a/tex/dart/page/button.dart b/tex/dart/page/button.dart new file mode 100644 index 0000000..5b10633 --- /dev/null +++ b/tex/dart/page/button.dart @@ -0,0 +1,14 @@ +ElevatedButton createButton(String txt, void Function() onPressing) { + return ElevatedButton( + onPressed: onPressing, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.resolveWith( + (states) => Colors.green.shade700)), + child: Text(txt, + style: const TextStyle( + fontSize: 15, + color: Colors.white70, + height: 1, + )), + ); + } \ No newline at end of file diff --git a/tex/dart/painter/arrow.dart b/tex/dart/painter/arrow.dart new file mode 100644 index 0000000..baeb8ac --- /dev/null +++ b/tex/dart/painter/arrow.dart @@ -0,0 +1,22 @@ + void _drawHArrow(Canvas canvas, Size size, Offset from, Offset to, [bool doubleSided = false]) { + Path path; + + // The arrows usually looks better with rounded caps. + Paint paint = ... // задается стиль + + var length = sqrt((to.dx - from.dx) * (to.dx - from.dx) + + (to.dy - from.dy) * (to.dy - from.dy)); + + path = Path(); + path.moveTo(from.dx, from.dy); + path.relativeCubicTo( + 0, + 0, + -(from.dx + to.dx + length) / (length) - 40, + -(from.dy + to.dy + length) / (length) - 40, + to.dx - from.dx, + to.dy - from.dy); + path = + ArrowPath.make(path: path, isDoubleSided: doubleSided, tipLength: 16); + canvas.drawPath(path, paint); + } \ No newline at end of file diff --git a/tex/dart/painter/constr.dart b/tex/dart/painter/constr.dart new file mode 100644 index 0000000..7deba68 --- /dev/null +++ b/tex/dart/painter/constr.dart @@ -0,0 +1,9 @@ +CurvePainter({ + Key? key, + required this.graphData, + required this.intListPath, + required this.dfsAccessTable, + required this.start, + required this.end, + required this.op, + }); \ No newline at end of file diff --git a/tex/dart/painter/pos.dart b/tex/dart/painter/pos.dart new file mode 100644 index 0000000..576c89d --- /dev/null +++ b/tex/dart/painter/pos.dart @@ -0,0 +1,24 @@ +Map _getDotPos(int dotsAm, Size size) { + Map off = {}; + var width = size.width / 2; + var height = size.height / 2; + int add = 0; + int h = _getHighInputConnections(); + for (int i = 0; i < dotsAm; i++) { + if ((i + 1) != h) { + double x = + cos(2 * pi * (i - add) / (dotsAm - add)) * _circleRad + width; + double y = + sin(2 * pi * (i - add) / (dotsAm - add)) * _circleRad + height; + + off[i + 1] = Offset(x, y); + } else if ((i + 1) == h) { + off[i + 1] = Offset(width + 2, height - 2); + add = 1; + h = 0; + } else { + print("GetDotPos error"); + } + } + return off; + } \ No newline at end of file diff --git a/tex/dart/pseudoDijkstra.txt b/tex/dart/pseudoDijkstra.txt new file mode 100644 index 0000000..7362dbc --- /dev/null +++ b/tex/dart/pseudoDijkstra.txt @@ -0,0 +1,9 @@ +dijkstra (G, w, s): + source(G,s) + S <- null + Q <- V[G] + while Q!=null: + u <- Extract_min(Q) + s <- S + u + для каждой вершины v из Adj[u]: + relax(u, v, w) \ No newline at end of file diff --git a/tex/dart/pseudoKruscal.txt b/tex/dart/pseudoKruscal.txt new file mode 100644 index 0000000..3464bf5 --- /dev/null +++ b/tex/dart/pseudoKruscal.txt @@ -0,0 +1,10 @@ +kruscal(G, w): + A <- null + for v из V[G]: + create_set(v) + sort(E) + for (u, v) из E: + if find_set(u) != find_set(v): + A <- A + {(u,v)} + + return A \ No newline at end of file diff --git a/tex/example-work.tex b/tex/example-work.tex index 28e31c0..8c6d82e 100644 --- a/tex/example-work.tex +++ b/tex/example-work.tex @@ -245,35 +245,49 @@ $$ E = \{(a, b), (a, c), (a, e), (b, c), (b, d), (c, e), (d, e)\}$$ Поиск в ширину имеет такое название потому, что в процессе обхода мы идём вширь, то есть перед тем как приступить к поиску вершин на расстоянии $k + 1$, выполняется обход вершин на расстоянии $k$~\cite{Algo_2013}. -Приведенная ниже процедура поиска в ширину BFS предполагает, что входной граф $G = (V, E)$ представлен при помощи списков смежности. Псевдокод: +Приведенная ниже процедура поиска в ширину BFS предполагает, что входной граф $G = (V, E)$ представлен при помощи списков смежности. Псевдокод алгоритма: \inputminted[fontsize=\footnotesize, linenos]{python}{./dart/pseudoBFS.txt} Воспользуемся групповым анализом. Операции внесения в очередь и удаление из нее требует $O(1)$ времени. Следовательно на очередь потребуется $O(V)$ времени. Т.к. максимальная длина списков смежности $\theta(E)$, то время, необходимое для сканирования списков, равно $O(E)$. Расходы на инициализацию: $O(V)$. Таким образом, общее время работы алгоритма: $O(V + E)$. Время поиска в ширину линейно зависит от размера представления графа. \subsubsection{Обход в глубину} +Стратегия обхода в ширину состоит в том, чтобы идти ''вглубь'' графа. Сначала исследуются ребра, выходящие из вершины, открытой последней, и покидаем вершину, когда не остается неисследованных ребер --- при этом происходит возврат в вершину, из которой была открыта вершина $v$. Процесс продолжается, пока не будут открыты все вершины, достижимые из исходной. - - - +Псевдо код алгоритма: \inputminted[fontsize=\footnotesize, linenos]{python}{./dart/pseudoDFS.txt} +\subsubsection{Алгоритм Дейкстры} +Алгоритм был предложен голландским исследователем Эдсгером Дейкстрой в 1959 году. Используется для поиска кратчайшего пути от одной вершины до всех остальных. Используется только если вес ребер неотрицательный. +В алгоритме поддерживается множество вершин $U$, для которых уже вычислены длины кратчайших путей до них из $s$. На каждой итерации основного цикла выбирается вершина, которой на текущий момент соответствует минимальная оценка кратчайшего пути. Вершина $u$ добавляется в множество $U$ и производится релаксация всех исходящих из неё рёбер. + +Псевдокод алгоритма: +\inputminted[fontsize=\footnotesize, linenos]{python}{./dart/pseudoDijkstra.txt} + +\subsubsection{Алгоритм Краскала} +Алгоритм Краскала — алгоритм поиска минимального остовного дерева во взвешенном неориентированном связном графе. Был описан Джозефом Краскалом в 1956 году. + +Алгоритм Крускала изначально помещает каждую вершину в своё дерево, а затем постепенно объединяет эти деревья, объединяя на каждой итерации два некоторых дерева некоторым ребром. Перед началом выполнения алгоритма, все рёбра сортируются по весу (в порядке неубывания). Затем начинается процесс объединения: перебираются все рёбра от первого до последнего (в порядке сортировки), и если у текущего ребра его концы принадлежат разным поддеревьям, то эти поддеревья объединяются, а ребро добавляется к ответу. По окончании перебора всех рёбер, все вершины окажутся принадлежащими одному поддереву.\cite{krusc} + +\inputminted[fontsize=\footnotesize, linenos]{python}{./dart/pseudoKruscal.txt} + \section{Инструменты} Рассмотрим используемый язык и библиотеку для отрисовки. \subsection{Dart} В качестве основы используется язык \textbf{Dart}, разработанный компанией Google, и широко используемый для кросс-платформенной разработки~\cite{dart_web}. - Dart позиционируется в качестве замены/альтернативы JavaScript. Один из разработчиков языка Марк Миллер (Mark S. Miller) написал, что JavaScript «имеет фундаментальные изъяны»\cite{futureOfJavascript} («Javascript has fundamental flaws…»), которые невозможно исправить. +Dart позиционируется в качестве замены/альтернативы JavaScript. Один из разработчиков языка Марк Миллер (Mark S. Miller) писал, что JavaScript «имеет фундаментальные изъяны»\cite{futureOfJavascript}, которые невозможно исправить. Версия 1.0 вышла в 14 ноября 2013 года. Вторая версия была выпущена в августе 2018 года. В языке появилась надежная система типов, т.~е. во время выполнении программы все переменные будут гарантированно указанному типу~\cite{dart_sound}. +В Dart используется сборщик мусора. Синтаксис похож на языки: JavaScript, C\#, Java~\cite{dartInAction}. + Пример HelloWorld на Dart: \inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/helloWorld.dart} Dart поддерживает сокращенную запись. Код примера HelloWorld можно записать так: \inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/hW.dart} - Концепты языка~\cite{dart_tour}: \begin{itemize} \item Все, что можно поместить в переменную, является объектом, а каждый объект является частью класса; @@ -283,7 +297,6 @@ Dart \item для объявления локальных функций и переменных необходимо начать имя со знака ''\_'' \end{itemize} . - \subsection{Flutter} Для отрисовки информации используется фреймворк c открытым исходным кодом ''Flutter'', разработанный компанией Google. Flutter не использует нативные компоненты для отрисовки интерфейса. В его основе лежит графический движок ''Skia'', написанный преимущественно на С++. @@ -299,48 +312,139 @@ Skia --- \caption{\label{fig:flutter_example} Простейшее приложение на Flutter} \end{figure} +Интерфейс описывается с помощью виджетов. \section{Реализация} +Структура программы разбита на 4 файла: + +\begin{itemize} + \item main.dart --- точка входа в программу; + \item drawing\_page.dart --- страница с описанием работы кнопок; + \item curve\_painter.dart --- функционал для отрисовки графа; + \item graph.dart --- класс для хранения графа и манипуляции с ним. +\end{itemize} + \subsection{Графы} -\subsubsection{Класс для вершины} -\subsubsection{Класс для графа} +Информация хранится в виде списков смежности. +Полный код можно посмотреть в приложении~\ref{graph}. +\subsubsection{Класс для хранения вершины} +Класс \textbf{Dot} используется для хранения информации о ребрах, исходящих из данной вершины. + +Основная информация: +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/graph/dot.dart} +\textit{String \_name} используется для хранения имени, \textit{int num} используется для хранения номера вершины. +Информация о ребрах задается в виде \textit{Map \_ln}, где каждой вершине можно присвоить вес ребра. + +Создать вершину можно тремя способами: +\begin{enumerate} + \item Пустая точка; + \item из двух списков, где в первом список вершин, а во втором - длины пути; + \item из \textit{Map}. +\end{enumerate} +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/graph/dot_constr.dart} + +Для манипуляций с информацией доступно: +\begin{enumerate} + \item изменение имени; + \item добавление пути; + \item удаление пути. +\end{enumerate} +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/graph/dot_manip.dart} + +\subsubsection{Класс для графов} +Класс \textbf{Graphs} используется для хранения точек и манипуляции с ними. + +Основная информация: +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/graph/graph.dart} +\textit{String \_name} исользуется для имени графа, \textit{int \_amount} --- количество вершин, \textit{List \_dots} --- массив точек, \textit{Map \_nameTable} --- отслеживание имени каждой вершины, \textit{bool \_useLength} --- отслеживание взвешенности графа, \textit{bool \_oriented} --- отслеживание ориентированности графа. + +Для работы графом доступны функции: +\begin{enumerate} + \item \textbf{String? addDot(Dot a)} --- добавление вершины; + \item \textbf{String? addIsolated(String name)} --- добавление изолированной точки; + \item \textbf{String? addPath(int from, int to, [int len = 0])} --- добавление пути; + \item \textbf{String? delPath(int from, int to)} --- удаление пути; + \item \textbf{String? delDot(int inn)} --- удаление вершины; + \item \textbf{void flushData()} --- удаление информации из графа; + \item \textbf{bool checkDots([bool verbose = false])} --- проверка графа на ошибки; + \item \textbf{void \_fixAfterDel(int inn}) --- испралвение нумерации после удаления; + \item \textbf{void \_syncNameTable()} --- синхронизация таблицы имен вершин; + \item \textbf{void setName(String name)} --- изменение имени; + \item \textbf{String? replaceDataFromFile(String path)} --- заменяет информацию графа на информацию из файла; + \item \textbf{List getSortedPathList()} --- возвращает список всех путей, отсортированный в порядке неубывания; + \item \textbf{void printG()} --- выводит информацию о графе в консоль; + \item \textbf{void printToFile(String name)} --- выводит информацию о графе в файл; +\end{enumerate} + +Создать граф можно тремя способами: +\begin{enumerate} + \item пустой граф; + \item из списка смежности; + \item из файла. +\end{enumerate} + \subsubsection{Алгоритмы} -\subsubsection{Кнопки} +Алгоритмы описаны в классе графа.\newline + +Обход в ширину: +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/graph/bfs.dart} +Обход в глубину: +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/graph/dfs.dart} +Алгоритм Дейкстры: +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/graph/dijkstra.dart} +Алгоритм Краскала: +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/graph/kruscal.dart} +\subsubsection{Интерфейс} +Интерфейс описан в файле drawing\_page.dart. Полный код доступен в приложении~\ref{buttons}. + +Интерфейс программы: +\begin{figure}[!ht] + \centering + \includegraphics[width=9cm]{./pic/grafs.png} + \caption{\label{fig:programm} + Интерфейс программы} +\end{figure} +\newpage +В качестве основы выбран виджет, сохраняющий состояние. + +Построение интерфейса: +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/page/build.dart} + +Запуск работы алгоритмов происходит по нажатию соответствующих кнопок, затем страница отрисовки, используя полученные данные, отрисовывает на экране информацию. \subsubsection{Отрисовка графа} +Отрисовка графа описана в файле curve\_painter.dart. Код доступен в приложении~\ref{painter}. -\section{Таблица} -\subsection{Текст с таблицей} +Для отрисовки информации используется виджет CustomPaint~\cite{custompaint}. -\begin{table}[!ht] - \small - \caption{Результат сокращения словарей неисправностей при помощи масок} \label{table-1} - \begin{tabular}{|l|c|c|c|c|r|r|r|} - \hline 1 & 2& 3& 4& 5& 6& 7& 8\\ - \hline S298 & 177 & 1932 & 341964 & 61 & 10797 & 3,16\% & 0,61\\ - \hline S344 & 240 & 1397 & 335280 & 59 & 14160 & 4,22\% & 0,53\\ - \hline S349 & 243 & 1474 & 358182 & 62 & 15066 & 4,21\% & 0,60\\ - \hline S382 & 190 & 12444 & 2364360 & 55 & 10450 & 0,44\% & 3,78\\ - \hline S386 & 274 & 2002 & 548548 & 91 & 24934 & 4,55\% & 1,40\\ - \hline S400 & 194 & 13284 & 2577096 & 58 & 11252 & 0,44\% & 4,28\\ - \hline S444 & 191 & 13440 & 2567040 & 60 & 11460 & 0,45\% & 4,26\\ - \hline S510 & 446 & 700 & 312200 & 70 & 31220 & 10,00\% & 0,63\\ - \hline S526 & 138 & 13548 & 1869624 & 38 & 5244 & 0,28\% & 2,41\\ - \hline S641 & 345 & 5016 & 1730520 & 132 & 45540 & 2,63\% & 7,06\\ - \hline S713 & 343 & 3979 & 1364797 & 131 & 44933 & 3,29\% & 5,61\\ - \hline S820 & 712 & 21185 & 15083720 & 244 & 173728 & 1,15\% & 126,99\\ - \hline S832 & 719 & 21603 & 15532557 & 253 & 181907 & 1,17\% & 135,18\\ - \hline S953 & 326 & 322 & 104972 & 91 & 29666 & 28,26\% & 0,27\\ - \hline S1423 & 293 & 750 & 219750 & 93 & 27249 & 12,40\% & 0,57\\ - \hline S1488 & 1359 & 22230 & 30210570 & 384 & 521856 & 1,73\% & 541,69\\ - \hline - \end{tabular} -\end{table} +Для передачи информации графа используется конструктор CurvePainter. +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/painter/constr.dart} +Отрисовка соединений происходит с помощью пакета ''arrow\_path''. +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/painter/arrow.dart} +Для упрощения отрисовки, точки располагаются на окружности с центом, совпадающим с центром экрана. Сначала вычисляется их местоположение на экране, точка с максимальным количеством соединений располагается в центре: +\inputminted[fontsize=\footnotesize, linenos]{dart}{./dart/painter/pos.dart} +Процесс вывода на экран: +\begin{enumerate} + \item вывод вершин на экран; + \item определение текущей операции и вывод работы текущего алгоритма; + \item вывод ребер; + \item вывод длин ребер; + \item вывод имен вершин. +\end{enumerate} +\subsubsection{Итоговый вид приложения} +Итоговое приложение выглядит так: +\begin{figure}[!ht] + \centering + \includegraphics[width=15cm]{./pic/result.png} + \caption{\label{fig:resutl} + Интерфейс программы} +\end{figure} +\newpage % Раздел "Заключение" \conclusion Было разработано простое приложение для создания и работы с графами с использованием Dart и Flutter. -В приложении возможно: +В приложении возможно с помощью графического интерфейса: \begin{itemize} \item создать пустой граф; \item добавить вершину; @@ -349,20 +453,13 @@ Skia --- \item удалить путь; \item сохранить граф; \item загрузить граф; - \item построить минимальное остовное дерево с помощью алгоритма Крускала; + \item построить минимальное остовное дерево с помощью алгоритма Краскала; \item найти минимальный путь из выбранной вершины в другие с помощью алгоритма Дейкстры; \item проверить доступность вершин с помощью обхода в глубину; \item построить путь из одной вершины в другую с помощью обхода в ширину. \end{itemize} -%Библиографический список, составленный вручную, без использования BibTeX -% -%\begin{thebibliography}{99} -% \bibitem{Ione} Источник 1. -% \bibitem{Itwo} Источник 2 -%\end{thebibliography} - %Библиографический список, составленный с помощью BibTeX % \bibliographystyle{gost780uv} diff --git a/tex/example-work.toc b/tex/example-work.toc index 1a9e1c1..13abea6 100644 --- a/tex/example-work.toc +++ b/tex/example-work.toc @@ -8,22 +8,29 @@ \contentsline {subsubsection}{\numberline {1.3.2}\IeC {\CYRM }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyra } \IeC {\cyrs }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrzh }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }}{6}{subsubsection.1.3.2}% \contentsline {subsubsection}{\numberline {1.3.3}\IeC {\CYRM }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyra } \IeC {\cyri }\IeC {\cyrn }\IeC {\cyrc }\IeC {\cyri }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }}{6}{subsubsection.1.3.3}% \contentsline {subsubsection}{\numberline {1.3.4}\IeC {\CYRS }\IeC {\cyrp }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyrk }\IeC {\cyri } \IeC {\cyrs }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrzh }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }}{7}{subsubsection.1.3.4}% -\contentsline {section}{\numberline {2}\IeC {\CYRI }\IeC {\cyrn }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyrery }}{8}{section.2}% -\contentsline {subsection}{\numberline {2.1}Dart}{8}{subsection.2.1}% -\contentsline {subsection}{\numberline {2.2}Flutter}{8}{subsection.2.2}% -\contentsline {section}{\numberline {3}\IeC {\CYRR }\IeC {\cyre }\IeC {\cyra }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrz }\IeC {\cyra }\IeC {\cyrc }\IeC {\cyri }\IeC {\cyrya }}{8}{section.3}% -\contentsline {subsection}{\numberline {3.1}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrf }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyrm }\IeC {\cyru }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyri } \IeC {\cyri } \IeC {\cyrl }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyro }\IeC {\cyrishrt }}{8}{subsection.3.1}% -\contentsline {subsection}{\numberline {3.2}\IeC {\CYRN }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrv }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre } \IeC {\cyrd }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyra }}{8}{subsection.3.2}% -\contentsline {subsubsection}{\numberline {3.2.1}\IeC {\CYRB }\IeC {\cyro }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyre } \IeC {\cyrm }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyrk }\IeC {\cyri }\IeC {\cyrishrt } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }}{8}{subsubsection.3.2.1}% -\contentsline {subsubsection}{\numberline {3.2.2}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrt }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyre }\IeC {\cyrishrt }}{8}{subsubsection.3.2.2}% -\contentsline {subsubsection}{\numberline {3.2.3}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrk }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyro }\IeC {\cyrm } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyrery }}{8}{subsubsection.3.2.3}% -\contentsline {section}{\cyrillictext \CYRZ \CYRA \CYRK \CYRL \CYRYU \CYRCH \CYRE \CYRN \CYRI \CYRE }{8}{section*.8}% -\contentsline {section}{\cyrillictext \CYRS \CYRP \CYRI \CYRS \CYRO \CYRK \ \CYRI \CYRS \CYRP \CYRO \CYRL \CYRSFTSN \CYRZ \CYRO \CYRV \CYRA \CYRN \CYRN \CYRERY \CYRH \ \CYRI \CYRS \CYRT \CYRO \CYRCH \CYRN \CYRI \CYRK \CYRO \CYRV }{10}{section*.9}% +\contentsline {subsection}{\numberline {1.4}\IeC {\CYRA }\IeC {\cyrl }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrt }\IeC {\cyrm }\IeC {\cyrery }}{7}{subsection.1.4}% +\contentsline {subsubsection}{\numberline {1.4.1}\IeC {\CYRO }\IeC {\cyrb }\IeC {\cyrh }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyrv } \IeC {\cyrsh }\IeC {\cyri }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrn }\IeC {\cyru }}{7}{subsubsection.1.4.1}% +\contentsline {subsubsection}{\numberline {1.4.2}\IeC {\CYRO }\IeC {\cyrb }\IeC {\cyrh }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyrv } \IeC {\cyrg }\IeC {\cyrl }\IeC {\cyru }\IeC {\cyrb }\IeC {\cyri }\IeC {\cyrn }\IeC {\cyru }}{8}{subsubsection.1.4.2}% +\contentsline {subsubsection}{\numberline {1.4.3}\IeC {\CYRA }\IeC {\cyrl }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrt }\IeC {\cyrm } \IeC {\CYRD }\IeC {\cyre }\IeC {\cyrishrt }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyrery }}{9}{subsubsection.1.4.3}% +\contentsline {subsubsection}{\numberline {1.4.4}\IeC {\CYRA }\IeC {\cyrl }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrt }\IeC {\cyrm } \IeC {\CYRK }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrk }\IeC {\cyra }\IeC {\cyrl }\IeC {\cyra }}{9}{subsubsection.1.4.4}% +\contentsline {section}{\numberline {2}\IeC {\CYRI }\IeC {\cyrn }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyrery }}{11}{section.2}% +\contentsline {subsection}{\numberline {2.1}Dart}{11}{subsection.2.1}% +\contentsline {subsection}{\numberline {2.2}Flutter}{12}{subsection.2.2}% +\contentsline {section}{\numberline {3}\IeC {\CYRR }\IeC {\cyre }\IeC {\cyra }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrz }\IeC {\cyra }\IeC {\cyrc }\IeC {\cyri }\IeC {\cyrya }}{14}{section.3}% +\contentsline {subsection}{\numberline {3.1}\IeC {\CYRG }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyrery }}{14}{subsection.3.1}% +\contentsline {subsubsection}{\numberline {3.1.1}\IeC {\CYRK }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrs } \IeC {\cyrd }\IeC {\cyrl }\IeC {\cyrya } \IeC {\cyrh }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrya } \IeC {\cyrv }\IeC {\cyre }\IeC {\cyrr }\IeC {\cyrsh }\IeC {\cyri }\IeC {\cyrn }\IeC {\cyrery }}{14}{subsubsection.3.1.1}% +\contentsline {subsubsection}{\numberline {3.1.2}\IeC {\CYRK }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrs } \IeC {\cyrd }\IeC {\cyrl }\IeC {\cyrya } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyro }\IeC {\cyrv }}{15}{subsubsection.3.1.2}% +\contentsline {subsubsection}{\numberline {3.1.3}\IeC {\CYRA }\IeC {\cyrl }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrt }\IeC {\cyrm }\IeC {\cyrery }}{16}{subsubsection.3.1.3}% +\contentsline {subsubsection}{\numberline {3.1.4}\IeC {\CYRI }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyre }\IeC {\cyrr }\IeC {\cyrf }\IeC {\cyre }\IeC {\cyrishrt }\IeC {\cyrs }}{19}{subsubsection.3.1.4}% +\contentsline {subsubsection}{\numberline {3.1.5}\IeC {\CYRO }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrk }\IeC {\cyra } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyra }}{21}{subsubsection.3.1.5}% +\contentsline {subsubsection}{\numberline {3.1.6}\IeC {\CYRI }\IeC {\cyrt }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrery }\IeC {\cyrishrt } \IeC {\cyrv }\IeC {\cyri }\IeC {\cyrd } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrl }\IeC {\cyro }\IeC {\cyrzh }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrya }}{23}{subsubsection.3.1.6}% +\contentsline {section}{\cyrillictext \CYRZ \CYRA \CYRK \CYRL \CYRYU \CYRCH \CYRE \CYRN \CYRI \CYRE }{24}{section*.10}% +\contentsline {section}{\cyrillictext \CYRS \CYRP \CYRI \CYRS \CYRO \CYRK \ \CYRI \CYRS \CYRP \CYRO \CYRL \CYRSFTSN \CYRZ \CYRO \CYRV \CYRA \CYRN \CYRN \CYRERY \CYRH \ \CYRI \CYRS \CYRT \CYRO \CYRCH \CYRN \CYRI \CYRK \CYRO \CYRV }{25}{section*.11}% \redeflsection \ttl@change@i {\@ne }{section}{3ex}{\hspace {-3ex}}{\appendixname ~\thecontentslabel \hspace {2ex}}{\hspace {2.3em}}{\titlerule *[0.98ex]{.}\contentspage }\relax \ttl@change@v {section}{}{}{}\relax -\contentsline {section}{\numberline {\CYRA }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } main.dart}{11}{appendix.A}% -\contentsline {section}{\numberline {\CYRB }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyrery } \IeC {\cyro }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrk }\IeC {\cyri }}{12}{appendix.B}% -\contentsline {section}{\numberline {\CYRV }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyro }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrk }\IeC {\cyri } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyra }}{23}{appendix.C}% -\contentsline {section}{\numberline {\CYRG }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyrk }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrs }\IeC {\cyra } \IeC {\cyrd }\IeC {\cyrl }\IeC {\cyrya } \IeC {\cyrr }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyro }\IeC {\cyrt }\IeC {\cyrery } \IeC {\cyrs } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyro }\IeC {\cyrm }}{30}{appendix.D}% +\contentsline {section}{\numberline {\CYRA }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } main.dart}{26}{appendix.A}% +\contentsline {section}{\numberline {\CYRB }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyrery } \IeC {\cyro }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrk }\IeC {\cyri }}{27}{appendix.B}% +\contentsline {section}{\numberline {\CYRV }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyro }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrk }\IeC {\cyri } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyra }}{38}{appendix.C}% +\contentsline {section}{\numberline {\CYRG }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyrk }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrs }\IeC {\cyra } \IeC {\cyrd }\IeC {\cyrl }\IeC {\cyrya } \IeC {\cyrr }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyro }\IeC {\cyrt }\IeC {\cyrery } \IeC {\cyrs } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyro }\IeC {\cyrm }}{45}{appendix.D}% \contentsfinish diff --git a/tex/lib/pages/drawing_page.dart b/tex/lib/pages/drawing_page.dart index aadccff..11f6d57 100644 --- a/tex/lib/pages/drawing_page.dart +++ b/tex/lib/pages/drawing_page.dart @@ -24,7 +24,6 @@ class _DrawingPageState extends State { Graphs graphData = getGraph(); List? intListPath; List? dfsAccessTable; - //List? dijkstraTable; String op = Operations.none; int? startDot; int? endDot; diff --git a/tex/lib/src/curve_painter.dart b/tex/lib/src/curve_painter.dart index c92ff75..ab5659d 100644 --- a/tex/lib/src/curve_painter.dart +++ b/tex/lib/src/curve_painter.dart @@ -128,7 +128,6 @@ class CurvePainter extends CustomPainter { print("GetDotPos error"); } } - return off; } @@ -245,7 +244,7 @@ class CurvePainter extends CustomPainter { _drawDot(canvas, _off[start]!, 9, Colors.green); _drawDot(canvas, _off[end]!, 7, Colors.red.shade200); for (int i = 0; i < intListPath!.length; i++) { - _drawDotNum(canvas, _off[intListPath![i]]!, "bfs: №${i + 1}"); + _drawDotNum(canvas, _off[intListPath![i]]!, "bfs: пїЅ${i + 1}"); } } } diff --git a/tex/lib/src/graph.dart b/tex/lib/src/graph.dart index c368d71..9ceafeb 100644 --- a/tex/lib/src/graph.dart +++ b/tex/lib/src/graph.dart @@ -449,7 +449,7 @@ class Graphs { result.sort((a, b) => a.l.compareTo(b.l)); return result; } - + //*****Getters******* //******Print****** @@ -541,7 +541,6 @@ class Graphs { //************Алгоритмы************ List? bfsPath(int startDot, int goalDot) { if (startDot == goalDot) return [startDot]; - //if (!bfsHasPath(startDot, goalDot)) return null; startDot--; goalDot--; List>? graph = getLenTable(); @@ -559,8 +558,7 @@ class Graphs { q.add(startDot); used[startDot] = true; dst[startDot] = 0; - pr[startDot] = - -1; //Пометка, означающая, что у вершины startDot нет предыдущей. + pr[startDot] = -1; //у вершины нет предыдущей. while (q.isNotEmpty) { int cur = q.removeAt(0); @@ -578,21 +576,16 @@ class Graphs { } } - //Восстановим кратчайший путь - //Для восстановления пути пройдём его в обратном порядке, и развернём. + //Восстановление кратчайшиего путьи List path = []; - - int cur = goalDot; //текущая вершина пути + int cur = goalDot; path.add(cur + 1); - while (pr[cur] != -1) { - //пока существует предыдущая вершина - cur = pr[cur]; //переходим в неё - path.add(cur + 1); //и дописываем к пути + cur = pr[cur]; + path.add(cur + 1); } path = path.reversed.toList(); - if (path[0] == (startDot + 1) && path[1] == (goalDot + 1) && !_dots[startDot].hasConnection(goalDot + 1)) return null; @@ -607,14 +600,12 @@ class Graphs { } List stack = []; stack.add(v); - //pos.add(v); while (stack.isNotEmpty) { v = stack.removeLast(); if (!label[v]) { label[v] = true; for (int i in _dots[v].getL().keys) { stack.add(i - 1); - //pos.add(i); } } } @@ -630,7 +621,6 @@ class Graphs { for (int i = 0; i < _amount; ++i) { int v = -1; for (int j = 0; j < _amount; ++j) { - // int t; if (!u[j] && (v == -1 || d[j]! < d[v]!)) { v = j; } @@ -647,7 +637,6 @@ class Graphs { } } for (int i = 0; i < d.length; i++) { - // подумать как убрать эту часть if (d[i] == intMax) d[i] = null; } return d; diff --git a/tex/pic/grafs.png b/tex/pic/grafs.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb4c74422d268bbd02c482b981c0bedf9a15586 GIT binary patch literal 28630 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
D>AI62HVUX;g!tfbyF{$2;2a3D=n(9Tj+e#|`5{ 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 literal 0 HcmV?d00001 diff --git a/tex/thesis.bib b/tex/thesis.bib index 8671968..d18d2ec 100644 --- a/tex/thesis.bib +++ b/tex/thesis.bib @@ -61,4 +61,14 @@ note={URL:~\url{https://skia.org/docs/}(Дата обращения 20.11.2021). Загл. с экр. Яз. англ.}, } +@Manual{krusc, + title={Минимальное остовное дерево. Алгоритм Крускала. [{Э}лектронный ресурс]}, + note={URL:~\url{https://e-maxx.ru/algo/mst_kruskal}(Дата обращения 20.11.2021). Загл. с экр. Яз. рус.}, +} + +@Manual{custompaint, + title={CustomPaint class. [{Э}лектронный ресурс]}, + note={URL:~\url{https://api.flutter.dev/flutter/widgets/CustomPaint-class.html}(Дата обращения 20.11.2021). Загл. с экр. Яз. англ.}, +} + @Comment{jabref-meta: databaseType:bibtex;}