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
При этом, можно заметить, что мы достигли конечной вершины в автомате. Последний элемент левой части результирующего
300
-
вектора $\fbox{1 1 \textcolor{red}{1}} \fbox{1 0 1 0}$ отвечает за состояние 2, которое является конечным. А значит, обход необходимо остановить, и текущие вершины фронта
301
-
обхода графа записать в ответ.
302
-
303
-
Таким образом, вершины графа 0 и 2 являются ответом. Однако вершина 0 --- лишняя. Регулярное выражение $b^*ab$ не подразумевает, что
304
-
вершина 0 в графе может быть достигнута. Она могла бы быть достигнута по пустой строке в случае, если бы регулярное выражение имело вид $b^*$ или
305
-
по строке $aba$ в случае, если бы регулярное выражение имело вид $b^*aba$.
306
-
307
-
Это произошло, потому что в векторе $v$ должна кодироваться информация о паре --- вершине графа и состоянии автомата.
308
-
Достигнув вершины 0, мы оказались в конечном состоянии автомата, которое было получено с помощью другой вершины --- вершины 2.
309
-
310
-
Эту проблему можно решить, закодировав информацию о каждой такой паре в несколько векторов $v$, и ограничив левую
311
-
часть вектора $v$ таким образом, чтобы в ней всегда была лишь одна единица.
312
-
313
-
Тогда мы получим, что вектор $v$ вида $\fbox{1 0 0} \fbox{1 0 1 0}$ будет хранить информацию о парах (0, 0) и (0, 2),
314
-
где первый элемент пары --- состояние автомата, а второй --- вершина графа.
315
-
316
-
Аналогично, вектор $v$ вида $\fbox{0 1 0} \fbox{0 1 1 0}$ кодирует информацию о парах (1, 1) и (1, 2).
317
-
Вектор $v$ вида $\fbox{0 0 1} \fbox{0 0 1 1}$ кодирует информацию о парах (2, 2) и (2, 3).
318
-
319
-
Таким образом, мы будем понимать, в каком состоянии автомата мы находимся для каждой из вершин фронта обхода графа.
320
-
321
-
Рассмотрим, как это применяется в разработанном алгоритме, который представлен далее.
322
-
323
-
Предлагается ``расклеить'' $v$ в матрицу $M$, состоящую из трех векторов, добавив два вектора $\fbox{0 1 0} \fbox{0 0 0 0}$ и $\fbox{0 0 1} \fbox{0 0 0 0}$.
324
-
Во второй части этих векторов стоят нули, так как \fbox{0 1 0} и \fbox{0 0 1} кодируют состояния автомата 1 и 2, которые не являются начальными.
325
-
326
-
\begin{alignat*}{7}
327
-
& &&M &&=\begin{matrix}
328
-
\fbox{1 0 0} \fbox{1 0 0 0} \\
329
-
\fbox{0 1 0} \fbox{0 0 0 0} \\
330
-
\fbox{0 0 1} \fbox{0 0 0 0}
331
-
\end{matrix}
332
-
\end{alignat*}
333
-
334
-
И совершать обход тем же самым образом, но сохранив с помощью матрицы $M$ дополнительную информацию о парах (состояние, вершина).
Допустим, что стартовыми вершинами в графе будут выбраны вершины 0 и 3.
149
+
Теперь создадим вектор $v = $\fbox{1 1 1} \fbox{1 0 0 1}, где в первой части стоят три единицы, соответствующие каждому состоянию автомата, в котором мы можем находиться. Во второй части содержится фронт обхода графа, на данном шаге это стартовые вершины.
360
150
361
151
\begin{alignat*}{7}
362
152
b:\,\,
@@ -392,13 +182,47 @@ \section{Достижимость с несколькими источникам
392
182
393
183
В нашем примере матрица $M$ для следующего шага обхода выглядит следующим образом.
394
184
395
-
\begin{alignat*}{7}
396
-
& &&M &&=\begin{matrix}
397
-
\fbox{1 0 0} \fbox{0 0 0 1} \\
398
-
\fbox{0 1 0} \fbox{0 1 0 0} \\
399
-
\fbox{0 0 1} \fbox{0 0 0 0}
400
-
\end{matrix}
401
-
\end{alignat*}
185
+
И совершать обход следующим образом.
186
+
\begin{alignat*}{7}
187
+
& \begin{matrix}
188
+
\fbox{1 0 0} \fbox{1 0 0 1} \\
189
+
\fbox{0 1 0} \fbox{1 0 0 1} \\
190
+
\fbox{0 0 1} \fbox{1 0 0 1}
191
+
\end{matrix} && \begin{pmatrix}
192
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
193
+
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
194
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
195
+
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
196
+
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
197
+
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
198
+
0 & 0 & 0 & 0 & 0 & 0 & 0
199
+
\end{pmatrix} &&= \begin{matrix}
200
+
\fbox{0 0 0} \fbox{0 1 0 0} \\
201
+
\fbox{0 0 0} \fbox{0 1 0 0} \\
202
+
\fbox{0 1 0} \fbox{0 1 0 0}
203
+
\end{matrix}
204
+
\end{alignat*}
205
+
206
+
\begin{alignat*}{7}
207
+
& \begin{matrix}
208
+
\fbox{1 0 0} \fbox{1 0 0 1} \\
209
+
\fbox{0 1 0} \fbox{1 0 0 1} \\
210
+
\fbox{0 0 1} \fbox{1 0 0 1}
211
+
\end{matrix} && \begin{pmatrix}
212
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
213
+
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
214
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
215
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
216
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
217
+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
218
+
0 & 0 & 0 & 0 & 0 & 1 & 0
219
+
\end{pmatrix} &&= \begin{matrix}
220
+
\fbox{0 0 0} \fbox{0 0 1 0} \\
221
+
\fbox{1 0 0} \fbox{0 0 1 0} \\
222
+
\fbox{0 0 0} \fbox{0 0 1 0}
223
+
\end{matrix}
224
+
\end{alignat*}
225
+
\end{example}
402
226
403
227
Видно, что во фронт обхода графа попали вершины 1 и 3. В вершину 1 мы попали в состоянии 1, в вершину 3 --- в состоянии 0.
0 commit comments