Главная / Программирование на языке Pascal / Какой алгоритм реализует приведенная ниже программа?type vertices = ^vertex; edges = ^edge; vertex = record id,dist: integer; incidence: edges; next: vertices; end; edge = record from,toward: vertices; len: integer; next: edges; end; ptr_edges = ^ptr_edge

Какой алгоритм реализует приведенная ниже программа?type vertices = ^vertex; edges = ^edge; vertex = record id,dist: integer; incidence: edges; next: vertices; end; edge = record from,toward: vertices; len: integer; next: edges; end; ptr_edges = ^ptr_edge; ptr_edge = record e: edges; next: ptr_edges; end; var i,j,len,source_id: integer; g,source: vertices; queue,head,next_head: ptr_edges; f: text; function new_vertex(i: integer; g: vertices): vertices; var v: vertices; begin new(v); v^.id:= i; v^.dist:= maxint; v^.incidence:= nil; v^.next:= g; new_vertex:= v end; function find_vertex(i: integer; g: vertices): vertices; var v: vertices; begin v:= g; while (v<>nil)and(v^.id<>i) do v:= v^.next; find_vertex:= v end; function find_edge(j: integer; n: edges): edges; var e: edges; begin e:= n; while (e<>nil)and(e^.toward^.id<>j) do e:= e^.next; find_edge:= e end; procedure new_edge(i,j,len: integer; var g: vertices); var vi,vj: vertices; eij: edges; begin vi:= find_vertex(i,g); if vi = nil then begin g:= new_vertex(i,g); vi:= g end; vj:= find_vertex(j,g); if vj = nil then begin g:= new_vertex(j,g); vj:= g end; eij:= find_edge(j,vi^.incidence); if eij = nil then begin new(eij); eij^.from:= vi; eij^.toward:= vj; eij^.len:= len; eij^.next:= vi^.incidence; vi^.incidence:= eij end end; procedure enqueue(v: vertices; var q,h: ptr_edges); var e: edges; pe: ptr_edges; begin e:= v^.incidence; while e<>nil do begin new(pe); pe^.e:= e; pe^.next:= nil; if q = nil then h:= pe else q^.next:= pe; q:= pe; e:= e^.next end end; procedure print_vertices(g: vertices); var v: vertices; begin v:= g; while v<>nil do begin writeln(source_id,' -> ',v^.id,' : ',v^.dist); v:= v^.next end end; procedure dispose_edges(n: edges); var e,e_next: edges; begin e:= n; while e<>nil do begin e_next:= e^.next; dispose(e); e:= e_next end end; procedure dispose_vertices(g: vertices); var v,v_next: vertices; begin v:= g; while v<>nil do begin v_next:= v^.next; dispose_edges(v^.incidence); dispose(v); v:= v_next; end; end; begin assign(f,'in'); reset(f); readln(f,source_id); {в первой строке записана начальная вершина} g:= nil; while not eof(f) do begin readln(f,i,j,len); {граф задан списком ребер: от, до, длина} new_edge(i,j,len,g); new_edge(j,i,len,g); end; source:= find_vertex(source_id,g); source^.dist:= 0; queue:= nil; head:= nil; enqueue(source,queue,head); while head<>nil do begin with head^.e^ do if from^.dist+len < toward^.dist then begin toward^.dist:= from^.dist + len; enqueue(toward,queue,head); end; next_head:= head ^.next; dispose(head); head:= next_head end; print_vertices(g); dispose_vertices(g); end.

вопрос

Правильный ответ:

подсчет количества компонент связности
нахождение минимального каркаса в связном графе
нахождение кратчайшего пути от выделенной вершины до всех остальных вершин связного неориентированного графа
Сложность вопроса
95
Сложность курса: Программирование на языке Pascal
75
Оценить вопрос
Очень сложно
Сложно
Средне
Легко
Очень легко
Комментарии:
Аноним
спасибо за пятёрку
07 сен 2019
Аноним
Я завалил зачёт, почему я не увидел этот чёртов сайт с ответами по интуит до сессии
02 окт 2017
Аноним
Я сотрудник университета! Срочно заблокируйте сайт и ответы intuit. Умоляю
06 окт 2016
Оставить комментарий
Другие ответы на вопросы из темы программирование интуит.