Files
PLC_Library/plc_src/POU/Иное/DFS.st
T

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