diff --git a/tex/RPQ.tex b/tex/RPQ.tex index 6af902a..7e072db 100644 --- a/tex/RPQ.tex +++ b/tex/RPQ.tex @@ -21,28 +21,35 @@ \section{Достижимость с несколькими источникам Покажем на примере, как данный метод может быть использован, когда мы накладываем дополнительные ограничения в виде регулярного языка на путь в графе. Для этого, во-первых, предъявим булевые представления для матриц смежности графа и автомата для регулярного языка. +\marginnote{TODO: Подумать над разбиением на разделы и подразделы} Затем, введем специальную блочно-диагональную матрицу для синхронизации обхода в ширину по двум матрицам смежности. Далее, попробуем наивно реализовать обход в ширину, и посмотрим, почему наивная реализация может выдавать некорректный результат. После этого перейдем к реализации обхода в ширину более продвинутым методом, который решает проблему наивного подхода. \subsection{Пример работы алгоритма} -\marginnote{TODO: Подумать над разбиением на разделы и подразделы} -Возьмём следующий граф. -\begin{center} - \label{input_rpq} - \begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto] - \node[state] (q_0) {$1$}; - \node[state] (q_1) [above=of q_0] {$2$}; - \node[state] (q_2) [right=of $(q_0)!0.5!(q_1)$] {$0$}; - \node[state] (q_3) [right=of q_2] {$3$}; - \path[->] - (q_0) edge node {b} (q_1) - (q_1) edge node[pos=0.3] {a} (q_2) - (q_2) edge node[pos=0.7] {a} (q_0) - (q_2) edge[bend left] node[above] {b} (q_3) - (q_3) edge[bend left] node {b} (q_2); - \end{tikzpicture} -\end{center} +\begin{marginfigure} + \caption{Входной граф.} + \label{fig:ms_rpq_graph} + \begin{center} + \begin{tikzpicture}[ + shorten >=1pt, + auto] + \node[state] (q_0) {$0$}; + \node[state] (q_1) [below left = of q_0] {$1$}; + \node[state] (q_2) [above left = of q_0] {$2$}; + \node[state] (q_3) [right = of q_0]{$3$}; + + \path[->] + (q_0) edge [bend left] node {$b$} (q_3) + (q_3) edge [bend left] node {$b$} (q_0) + (q_0) edge node {$a$} (q_1) + (q_1) edge node {$b$} (q_2) + (q_2) edge node {$a$} (q_0); + \end{tikzpicture} + \end{center} +\end{marginfigure} +Возьмём граф изображенный на рисунке~\ref{fig:ms_rpq_graph}. + Его матрица смежности имеет следующий вид. \marginnote{TODO: Точка внизу или снизу?} @@ -540,6 +547,7 @@ \subsection{Процесс обхода графа} Далее, с помощью операций перестановки и сложения векторов $M'$ преобразуется к виду матрицы $M$ и присваивается ей. Итерации продолжаются пока $M'$ содержит новые вершины, не содержащиеся в $M$. На листинге~\ref{BFSRPQ1} представлен этот алгоритм. +%% FIXME: Переверстать алгоритм % \begin{algorithm}[t] % \caption{Алгоритм достижимости в графе с регулярными ограничениями на основе поиска в ширину, выраженный с помощью операций матричного умножения}\label{BFSRPQ1} % \begin{algorithmic}[1] @@ -575,6 +583,7 @@ \subsection{Процесс обхода графа} То есть, имела единицы на главной диагонали, а все остальные значения в первых $k$ столбцах были нулями. Подробнее эта процедура описана в листинге~\ref{AlgoTransformRows}. +%% FIXME: Переверстать алгоритм % \begin{algorithm}[H] % \caption{Алгоритм трансформации строчек}\label{AlgoTransformRows} % \begin{algorithmic}[1] @@ -604,6 +613,7 @@ \subsection{Модификации алгоритма} Матрица $\mfrakM$ собирается из множества матриц $M(V_{\mathrm{src}}^i)$ и позволяет хранить информацию о том, из какой начальной вершины достигаются новые вершины во время обхода. +%% FIXME: Переверстать алгоритм % \begin{algorithm}[t] % \caption{Модификация алгоритма для поиска конкретной исходной вершины}\label{BFSRPQ2} % \begin{algorithmic}[1]