You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: tex/GraphTheoryIntro.tex
+93-8Lines changed: 93 additions & 8 deletions
Original file line number
Diff line number
Diff line change
@@ -473,9 +473,25 @@ \section{Обход графа в ширину}
473
473
\end{pmatrix}.
474
474
\end{align*}
475
475
476
-
Состояние графа после первой итерации показано на рисунке~\ref{fig:bfs_step_1}.
476
+
Состояние графа после первой итерации показано на рисунке~\ref{fig:bfs_step_1}: вершина \circled{2} --- изначальное состояние фронта, а вершины \circled{1} и \circled{3} достижимы из него за один шаг.
477
477
478
478
На втором шаге из текущего фронта мы можем попасть в вершины \circled{1} и \circled{2}.
479
+
Сначала обновим информацию о посещённых вершинах.
480
+
481
+
\begin{align*}
482
+
\emph{visited} & =
483
+
\begin{pmatrix}
484
+
0 & 0 & 1 & 0
485
+
\end{pmatrix}\oplus^\BbbB
486
+
\begin{pmatrix}
487
+
1 & 0 & 0 & 1
488
+
\end{pmatrix} &=
489
+
\begin{pmatrix}
490
+
1 & 0 & 1 & 1
491
+
\end{pmatrix}
492
+
\end{align*}
493
+
494
+
Затем вычислим новый фронт.
479
495
480
496
\begin{align*}
481
497
\emph{new\_front} & =
@@ -501,7 +517,7 @@ \section{Обход графа в ширину}
501
517
0 & 1 & 1 & 0
502
518
\end{pmatrix} \oplus^\BbbM
503
519
\begin{pmatrix}
504
-
0 & 0 & 1 & 0
520
+
1 & 0 & 1 & 1
505
521
\end{pmatrix} \\ &=
506
522
\begin{pmatrix}
507
523
0 & 1 & 0 & 0
@@ -562,7 +578,8 @@ \section{Обход графа в ширину}
562
578
Идея его такая же, как у рассмотренного выше, однако фронт~--- это уже не вектор, а матрица размера $k \times |V|$, где $k$~--- количество стартовых вершин, каждая строка которой является фронтом для одной из стартовых вершин\sidenote{
563
579
Такакя конструкция действительно является лишь естественным для алгоритмов, выреженных в терминах операций линейной алгебры, способом запустить несколько независимых обходов параллельно.
564
580
}.
565
-
581
+
Псевдокод такой вариации представлен на листинге~\ref{algo:MS-BFS_linal}.
582
+
Можно заметить, что алгоритм отличается от обхода с одной стартовой вершиной только инициализацией данных.
566
583
567
584
\begin{algorithm}
568
585
\SetAlgoLined
@@ -571,7 +588,7 @@ \section{Обход графа в ширину}
571
588
\KwResult{Матрица, $i$-я строка которой указывает, какие вершины достижимы из $K[i]$}
@@ -608,7 +648,8 @@ \section{Обход графа в ширину}
608
648
\label{fig:ms_bfs_step_1}
609
649
\end{marginfigure}
610
650
611
-
Шаг 1~\ref{fig:ms_bfs_step_1}
651
+
Первый шаг представлен на изображении~\ref{fig:ms_bfs_step_1}: из двух стартовых вершин мы можем попасть в вершину \circled{2}.
652
+
Можно заметить, что фронт хранит информацию о том, что \circled{2} достижима и из вершины \circled{1}, и из вершины \circled{1}.
612
653
613
654
\begin{marginfigure}
614
655
\begin{center}
@@ -618,10 +659,54 @@ \section{Обход графа в ширину}
618
659
\label{fig:ms_bfs_step_2}
619
660
\end{marginfigure}
620
661
621
-
Шаг 2~\ref{fig:ms_bfs_step_2}
662
+
Проделаем ещё один шаг.
663
+
Он будет последим содержательным шагом: на следующем шаге мы всего лишь узнаем, что все вершины посещены.
664
+
\begin{align*}
665
+
\emph{new\_front} & = \emph{current\_front} \mmult{\BbbB} M \\
666
+
& =
667
+
\begin{pmatrix}
668
+
0 & 0 & 1 & 0 \\
669
+
0 & 0 & 1 & 0
670
+
\end{pmatrix} \mmult{\BbbB}
671
+
\begin{pmatrix}
672
+
0 & 1 & 0 & 0 \\
673
+
0 & 0 & 1 & 0 \\
674
+
1 & 0 & 0 & 1 \\
675
+
0 & 0 & 1 & 0
676
+
\end{pmatrix} \\ &=
677
+
\begin{pmatrix}
678
+
1 & 0 & 0 & 1 \\
679
+
1 & 0 & 0 & 1
680
+
\end{pmatrix}.
681
+
\end{align*}
682
+
683
+
684
+
685
+
Результат шага представлен на рисунке~\ref{fig:ms_bfs_step_2}.
686
+
Здесь важно обратить внимание на вершину \circled{3}: она буде повторно посещённой для стартовой вершины \circled{3}, но для вершины \circled{1} мы пришли в неё впервые.
687
+
Потому фронт для следующей итерации будет выглядеть следующим образом.
0 commit comments