Скачать презентацию ТЕМА ПОИСК В ГРАФЕ ЗАДАЧА 1 Пример Скачать презентацию ТЕМА ПОИСК В ГРАФЕ ЗАДАЧА 1 Пример

Презентация 38_ОАиП.ppt

  • Количество слайдов: 14

ТЕМА: ПОИСК В ГРАФЕ. ТЕМА: ПОИСК В ГРАФЕ.

ЗАДАЧА 1: Пример программы поиска пути из одной вершины в другую вершину ориентированного графа. ЗАДАЧА 1: Пример программы поиска пути из одной вершины в другую вершину ориентированного графа.

Program breadth_first_search; Uses crt; Const n=6; m: array[1. . n, 1. . n] of Program breadth_first_search; Uses crt; Const n=6; m: array[1. . n, 1. . n] of boolean = ( (False, True, False, False), (False, False, False, False), (False, True, False, True ), (False, True, False) ); Var A, B: integer;

 Procedure A_to_B(A, B: integer); Var Visited: array[1. . n] of boolean; Prev: array[1. Procedure A_to_B(A, B: integer); Var Visited: array[1. . n] of boolean; Prev: array[1. . n] of integer; c: array[1. . n] of integer; head, tail: integer; f: boolean; i, v, k: integer; Begin head: =1; tail: =1; f: =False; For i: =1 to n do Begin Visited[i]: =False; Prev[i]: =0 End; C[tail]: =A; Visited[A]: =True;

 While (head<=tail) and not f do Begin v: =C[head]; head: =head+1; For k: While (head<=tail) and not f do Begin v: =C[head]; head: =head+1; For k: =1 to n do if m[v, k] and not Visited[k] then Begin tail: =tail+1; C[tail]: =k; Visited[k]: =True; Prev[k]: =v; if k=B then Begin f: =true; break End End;

 if f then Begin k: =B; Write(B); While Prev[k]<>0 do Begin Write('<-', Prev[k]); if f then Begin k: =B; Write(B); While Prev[k]<>0 do Begin Write('<-', Prev[k]); k: =Prev[k] end End else Write('Пути из ', A, ' в ', B, ' нет') end; Begin Write('A= '); readln(A); Write('B= '); readln(B); A_to_B(A, B) End.

ЗАДАЧА 2: Карта дорог между городами может быть изображена в виде графа – набора ЗАДАЧА 2: Карта дорог между городами может быть изображена в виде графа – набора вершин, обозначающих города, и ребер, обозначающих дороги. 2 5 3 7 1 6 4

 Граф можно представить двумерным массивом, который назовем map (карта). Значение элемента массива map[i, Граф можно представить двумерным массивом, который назовем map (карта). Значение элемента массива map[i, j] – единица, если города i и j соединены прямой дорогой, или ноль, если города не соединены дорогой. Для приведенного графа массив map можно изобразить в виде таблицы так: 1 7 1 6 4 5 6 7 0 1 1 1 0 0 0 3 1 0 0 1 4 3 4 1 5 3 2 2 2 1 0 0 1 0 5 0 0 0 1 1 6 0 0 0 1 1 0 1 7 0 0 1 1 0

 Помимо массива map нам потребуется массив road (дорога) и массив incl (от слова Помимо массива map нам потребуется массив road (дорога) и массив incl (от слова include – включать). В road[i] мы будем записывать номера пройденных городов. В момент достижения конечной точки он будет содержать номера всех пройденных точек, т. е. описание маршрута. В incl[i] будем записывать. TRUE, если точка с номером i включена в маршрут. Делается это для того, чтобы не включать в маршрут уже пройденную точку. Ниже приведен текст программы писка всех возможных маршрутов между двумя точками графа.

Program all_road; Uses crt; const N=7; {кол-во вершин графа} Var map: array[1. . N, Program all_road; Uses crt; const N=7; {кол-во вершин графа} Var map: array[1. . N, 1. . N] of integer; {Карта: map[i, j] не 0, если точки i и j соединены} road: array[1. . N] of integer; {Маршрут – номера точек карты} incl: array[1. . N] of Boolean; {incl[i]=TRUE, если точка с номером i включена в road} start, finish: integer; {Начальная и конечные точки} i, j: integer; procedure step (s, f, p: integer); {s – точка, из которой делается шаг} {f – конечная точка маршрута} {p – номер искомой точки маршрута} var c: integer; {Номер точки, в которую делается очередной шаг}

begin if s=f then begin {точки s и f совпали!} write (‘Путь: ’); for begin if s=f then begin {точки s и f совпали!} write (‘Путь: ’); for i: =1 to p-1 do write (road[i], ‘ ‘); writeln; end else begin {Выбираем очередную точку} for c: =1 to N do begin {Проверяем все вершины} if (map[s, c]<>0) and (NOT incl[c]) {Точки соединения с текущей и не включена в маршрут} then begin road[p]: =c; {Добавим вершину в путь} incl[c]: =TRUE; {Пометим вершину как включенную} step (c, f, p+1); incl[c]: =FALSE; road[p]: =0; end; {конец процедуры step}

{Основная программа} begin {инициализация массивов} for i: =1 to N do road[i]: =0; for {Основная программа} begin {инициализация массивов} for i: =1 to N do road[i]: =0; for i: =1 to N do incl[i]: =FALSE; for i: =1 to N do for j: =1 to N do map[i, j]: =0; {Ввод значений элементов карты} map[1, 2]: =1; map[2, 1]: =1; map[1, 3]: =1; map[3, 1]: =1; map[1, 4]: =1; map[4, 1]: =1; map[3, 7]: =1; map[7, 3]: =1; map[4, 6]: =1; map[6, 4]: =1; map[5, 6]: =1; map[6, 5]: =1; map[5, 7]: =1; map[7, 5]: =1; map[6, 7]: =1; map[7, 6]: =1;

map[6, 7]: =1; map[7, 6]: =1; write(‘Введите через пробел номера начальной и конечной точек>’); map[6, 7]: =1; map[7, 6]: =1; write(‘Введите через пробел номера начальной и конечной точек>’); readln (start, finish); road[1]: =start; {Внесем точку в маршрут} incl[start]: =TRUE; {Пометим ее как включенную} step (start, finish, 2); {Ищем вторую точку маршрута} end.

ЗАДАНИЕ: 1. 2. Разработать программы: Поиска пути из одной вершины графа в другую. Поиска ЗАДАНИЕ: 1. 2. Разработать программы: Поиска пути из одной вершины графа в другую. Поиска всех возможных маршрутов между двумя точками графа.