49 lines
1.4 KiB
Smalltalk
49 lines
1.4 KiB
Smalltalk
(*
|
|
===============================================================================
|
|
Project : PLC_Library
|
|
Device : -
|
|
Path : Иное
|
|
Name : DFS
|
|
Type : PROGRAM
|
|
===============================================================================
|
|
*)
|
|
|
|
PROGRAM DFS
|
|
(* Алгоритм поиска в глубину *)
|
|
(* Копировать в свою программу *)
|
|
VAR_INPUT
|
|
graph: POINTER TO ARRAY[1..n, 1..n] OF BOOL; // Граф связности (редактируется извне программы через DFS.graph[i,j])
|
|
connected: POINTER TO ARRAY[1..n] OF INT; //подключенные вершины
|
|
Start: INT := 1; // Вершина из которой начинается поиск
|
|
END_VAR
|
|
VAR
|
|
STACK: STACK_I16;
|
|
v: INT;
|
|
i: INT;
|
|
visited: ARRAY[1..n] OF BOOL; // посещенные вершины
|
|
k: INT := 1; // номер посещенной вершины
|
|
END_VAR
|
|
VAR CONSTANT
|
|
n : INT := 12; // Количество вершин графа
|
|
END_VAR
|
|
(*----- IMPLEMENTATION -----*)
|
|
FOR i:=1 TO n DO
|
|
visited[i]:=0;
|
|
connected^[i]:=0;
|
|
END_FOR
|
|
k:=1;
|
|
|
|
STACK(Din:= Start, PUSH:= 1);
|
|
visited[Start]:= 1;
|
|
WHILE NOT STACK.EMPTY DO
|
|
STACK(pop:= 1, Dout=>v);
|
|
FOR i:=1 TO n DO
|
|
IF (graph^[v,i] AND NOT(visited[i])) THEN
|
|
visited[i]:= 1;
|
|
STACK(Din:= i, PUSH:= 1);
|
|
connected^[k]:=i;k:=k+1;
|
|
END_IF
|
|
END_FOR
|
|
END_WHILE
|
|
END_PROGRAM
|