<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1546816</guid>
        <pubDate>Mon, 30 Apr 2007 04:37:42 +0000</pubDate>
        <title>Требуется&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1546816</link>
        <description><![CDATA[Glex: <strong class='tag-b'>Дейкстра с бинарным деревом (heap&#39;ом)</strong> в НГ<br>
Способ представления графа: списки смежности<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">program DijkstraViaHeap_01;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;FIN &nbsp;= &#39;dijkstra.in&#39;;</div><div class="code_line">&nbsp;&nbsp;FOUT &nbsp;= &#39;dijkstra.out&#39;;</div><div class="code_line">&nbsp;&nbsp;NMAX = 30000;</div><div class="code_line">&nbsp;&nbsp;INF &nbsp;= high(integer) div 2 - 1;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;PEdge = ^TEdge;</div><div class="code_line">&nbsp;&nbsp;TVertex = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;num: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;key: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;THeap = class</div><div class="code_line">&nbsp;&nbsp; &nbsp;a: array of TVertex;</div><div class="code_line">&nbsp;&nbsp; &nbsp;index_by_num: array of integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;length: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function LChild(const k: integer): integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function RChild(const k: integer): integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Parent(const k: integer): integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Add(var v: TVertex); overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Add(const num, key: integer); overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Swap(const i, j: integer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Update(const num: integer; const new_key: integer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;function ExtractMin(): TVertex;</div><div class="code_line">&nbsp;&nbsp; &nbsp;constructor Create(const allocSize: integer); overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;constructor Create(const allocSize: integer; const keys: array of integer); overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;TEdge = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;v: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;w: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;next: PEdge;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure THeap.Add(const num, key: integer);</div><div class="code_line">var v: TVertex;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;v.num := num;</div><div class="code_line">&nbsp;&nbsp;v.key := key;</div><div class="code_line">&nbsp;&nbsp;add(v);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">constructor THeap.Create(const allocSize: integer);</div><div class="code_line">var i: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;length := 0;</div><div class="code_line">&nbsp;&nbsp;setlength(a, allocSize);</div><div class="code_line">&nbsp;&nbsp;setlength(index_by_num, allocSize);</div><div class="code_line">&nbsp;&nbsp;for i := 0 to allocSize - 1 do index_by_num[i] := -1;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">constructor THeap.Create(const allocSize: integer; const keys: array of integer);</div><div class="code_line">var i: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;v: TVertex;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;length := 0;</div><div class="code_line">&nbsp;&nbsp;setlength(a, allocSize);</div><div class="code_line">&nbsp;&nbsp;setlength(index_by_num, allocSize);</div><div class="code_line">&nbsp;&nbsp;for i := 0 to allocSize - 1 do index_by_num[i] := -1;</div><div class="code_line">&nbsp;&nbsp;for i := 0 to allocSize - 1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; v.num := i + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; v.key := keys[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp; add(v);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THeap.LChild(const k: integer): integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;result := 2 * k + 1;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THeap.RChild(const k: integer): integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;result := 2 * (k + 1);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THeap.Parent(const k: integer): integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if k = 0 then result := -1</div><div class="code_line">&nbsp;&nbsp;else result := (k - 1) div 2;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure THeap.Swap(const i, j: integer);</div><div class="code_line">var t: TVertex;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;index_by_num[a[i].num - 1] := j;</div><div class="code_line">&nbsp;&nbsp;index_by_num[a[j].num - 1] := i;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;t &nbsp; &nbsp;:= a[i];</div><div class="code_line">&nbsp;&nbsp;a[i] := a[j];</div><div class="code_line">&nbsp;&nbsp;a[j] := t;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure THeap.Add(var v: TVertex);</div><div class="code_line">var k, p: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inc(length);</div><div class="code_line">&nbsp;&nbsp;k := length - 1;</div><div class="code_line">&nbsp;&nbsp;a[k] := v;</div><div class="code_line">&nbsp;&nbsp;index_by_num[v.num - 1] := k;</div><div class="code_line">&nbsp;&nbsp;p := parent(k);</div><div class="code_line">&nbsp;&nbsp;while (p &#60;&#62; -1) and (a[p].key &#62; a[k].key) do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;swap(p, k);</div><div class="code_line">&nbsp;&nbsp; &nbsp;k := p; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;p := parent(k);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THeap.ExtractMin(): TVertex;</div><div class="code_line">var new_key: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;result := a[0];</div><div class="code_line">&nbsp;&nbsp;swap(0, length - 1);</div><div class="code_line">&nbsp;&nbsp;dec(length);</div><div class="code_line">&nbsp;&nbsp;index_by_num[result.num - 1] := -1;</div><div class="code_line">&nbsp;&nbsp;new_key := a[0].key;</div><div class="code_line">&nbsp;&nbsp;a[0].key := result.key;</div><div class="code_line">&nbsp;&nbsp;update(a[0].num, new_key);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure THeap.Update(const num: integer; const new_key: integer);</div><div class="code_line">var k, p, c1, c2: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;k := index_by_num[num - 1];</div><div class="code_line">&nbsp;&nbsp;if (k = -1) or (k &#62; length - 1) then exit;</div><div class="code_line">&nbsp;&nbsp;if new_key &#60; a[k].key then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;a[k].key := new_key;</div><div class="code_line">&nbsp;&nbsp; &nbsp;p := parent(k);</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (p &#60;&#62; -1) and (a[p].key &#62; a[k].key) do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;swap(p, k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;k := p;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;p := parent(k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp;else begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;a[k].key := new_key;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while true do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;c1 := lchild(k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;c2 := rchild(k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;p := k;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (c1 &#60; length) and (a[c1].key &#60; a[p].key) then p := c1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (c2 &#60; length) and (a[c2].key &#60; a[p].key) then p := c2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if p = k then break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;swap(p, k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;k := p;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure addEdge(var l: PEdge; const v, w: integer);</div><div class="code_line">var t: PEdge;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;new(t);</div><div class="code_line">&nbsp;&nbsp;t.next := l;</div><div class="code_line">&nbsp;&nbsp;t.v := v;</div><div class="code_line">&nbsp;&nbsp;t.w := w;</div><div class="code_line">&nbsp;&nbsp;l := t;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;n, m: integer;</div><div class="code_line">&nbsp;&nbsp;e: array[1..NMAX] of PEdge;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Dijkstra(const s, t: integer);</div><div class="code_line">var i: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;min: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cur: PEdge;</div><div class="code_line">&nbsp;&nbsp; &nbsp;heap: THeap;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dist: array[1..NMAX] of integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;prev: array[1..NMAX] of integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;for i := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;dist[i] := INF;</div><div class="code_line">&nbsp;&nbsp; &nbsp;prev[i] := -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;prev[s] := 0;</div><div class="code_line">&nbsp;&nbsp;dist[s] := 0;</div><div class="code_line">&nbsp;&nbsp;heap := THeap.Create(n, dist);</div><div class="code_line">&nbsp;&nbsp;while heap.length &#62; 0 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;min := heap.ExtractMin().num;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cur := e[min];</div><div class="code_line">&nbsp;&nbsp; &nbsp;while cur &#60;&#62; nil do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if dist[cur.v] &#62; dist[min] + cur.w then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;prev[cur.v] := min;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dist[cur.v] := dist[min] + cur.w;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;heap.update(cur.v, dist[cur.v]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cur := cur.next;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;for i := 1 to n - 1 do write(dist[i], &#39; &#39;);</div><div class="code_line">&nbsp;&nbsp;writeln(dist[n]);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var i, u, v, w: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;AssignFile(input, FIN); &nbsp; reset(input);</div><div class="code_line">&nbsp;&nbsp;AssignFile(output, FOUT); rewrite(output);</div><div class="code_line">&nbsp;&nbsp;read(n, m);</div><div class="code_line">&nbsp;&nbsp;for i := 1 to m do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;read(u, v, w);</div><div class="code_line">&nbsp;&nbsp; &nbsp;addEdge(e[u], v, w);</div><div class="code_line">&nbsp;&nbsp; &nbsp;addEdge(e[v], u, w);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;Dijkstra(1, 0);</div><div class="code_line">&nbsp;&nbsp;close(input);</div><div class="code_line">&nbsp;&nbsp;close(output);</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Время работы O(v * log(v) + e * log(e)), где v и t кол-во вершин и рёбер соответственно.<br>
Красивое подробное пояснение с картинками http://ru.wikipedia.org/wiki/Алгоритм_Дейкстры<br>
<br>
Дейсктра на массиве и ОГ<br>
Способ представления графа: списки смежности<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">program DijkstraViaArray_01;</div><div class="code_line">{$Q+} {$R+}</div><div class="code_line">{/$DEFINE FILE_IO}</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;SysUtils;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;NMAX = 1000;</div><div class="code_line">&nbsp;&nbsp;INF &nbsp; = high(Integer) div 2 - 1;</div><div class="code_line">&nbsp;&nbsp;INF64 = 100000000000000;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;PEdge = ^TEdge;</div><div class="code_line">&nbsp;&nbsp;TEdge = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;v: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;w: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;next: PEdge;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;procedure addEdge(var l: PEdge; const v: integer; const w: integer);</div><div class="code_line">&nbsp;&nbsp;var t: PEdge;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;new(t);</div><div class="code_line">&nbsp;&nbsp; &nbsp;t.next := l;</div><div class="code_line">&nbsp;&nbsp; &nbsp;t.v := v;</div><div class="code_line">&nbsp;&nbsp; &nbsp;t.w := w;</div><div class="code_line">&nbsp;&nbsp; &nbsp;l := t;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;n, m: integer;</div><div class="code_line">&nbsp;&nbsp;s, t: integer;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure solve(s, t: integer);</div><div class="code_line">var i: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dist: array[0..NMAX] of int64;</div><div class="code_line">&nbsp;&nbsp; &nbsp;prev: array[1..NMAX] of integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;used: array[1..NMAX] of byte;</div><div class="code_line">&nbsp;&nbsp; &nbsp;e: array[1..NMAX] of PEdge;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;path: string;</div><div class="code_line">&nbsp;&nbsp; &nbsp;path_length: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;u, v, w: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;min: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cur: PEdge;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;for i := 1 to NMAX do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;e[i] := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dist[i] := INF64;</div><div class="code_line">&nbsp;&nbsp; &nbsp;prev[i] := -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;used[i] := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for i := 1 to m do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;read(u, v, w);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (u = v) then continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp;addEdge(e[u], v, w);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;dist[s] := 0;</div><div class="code_line">&nbsp;&nbsp;prev[s] := 0;</div><div class="code_line">&nbsp;&nbsp;used[s] := 1;</div><div class="code_line">&nbsp;&nbsp;dist[0] := INF64;</div><div class="code_line">&nbsp;&nbsp;fillchar(used, sizeof(used), 0);</div><div class="code_line">&nbsp;&nbsp;while true do begin</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;min := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (used[i] = 0) and (dist[i] &#60; dist[min])</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;then min := i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if min = 0 then break;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;used[min] := 1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cur := e[min];</div><div class="code_line">&nbsp;&nbsp; &nbsp;while cur &#60;&#62; nil do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (Int64(dist[cur.v] - dist[min]) - Int64(cur.w) &#62; 0) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;prev[cur.v] := min;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dist[cur.v] := Int64(dist[min]) + Int64(cur.w);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cur := cur.next;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if dist[t] = INF64 then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;writeln(&#39;-1&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;write(dist[t], &#39; &#39;);</div><div class="code_line">&nbsp;&nbsp;path := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;path_length := 0;</div><div class="code_line">&nbsp;&nbsp;while t &#60;&#62; 0 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;path := inttostr(t) + &#39; &#39; + path;</div><div class="code_line">&nbsp;&nbsp; &nbsp;t := prev[t];</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc(path_length);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if path_length &#60;&#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;setlength(path, length(path) - 1);</div><div class="code_line">&nbsp;&nbsp;Writeln(path_length);</div><div class="code_line">&nbsp;&nbsp;writeln(path);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;{$IFDEF FILE_IO}</div><div class="code_line">&nbsp;&nbsp;assign(input, &#39;dijkstra.in&#39;); reset(input);</div><div class="code_line">&nbsp;&nbsp;assign(output, &#39;dijkstra.out&#39;); rewrite(output);</div><div class="code_line">&nbsp;&nbsp;{$ENDIF}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;read(n, m);</div><div class="code_line">&nbsp;&nbsp;read(s, t);</div><div class="code_line">&nbsp;&nbsp;solve(s, t);</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
<br>
<br>
Дейсктры в ОГ и в НГ ничем не отличаются друг от друга в реализации.<br>
Хотелось бы переделать объяснение работы (или хотя бы взять его из Кормена), но времени как всегда нет.. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2007-04-30T08:46:19+04:00">30.04.07, 04:46</time></span></span><br>
<strong class='tag-b'>Поиск в ширину на списках смежности</strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">program BFS_01;</div><div class="code_line">uses Contnrs;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;FIN &nbsp;= &#39;breadth.in&#39;;</div><div class="code_line">&nbsp;&nbsp;FOUT = &#39;breadth.out&#39;;</div><div class="code_line">&nbsp;&nbsp;NMAX = 30000;</div><div class="code_line">&nbsp;&nbsp;INF &nbsp;= high(integer) div 2 - 1;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;PEdge = ^TEdge;</div><div class="code_line">&nbsp;&nbsp;TEdge = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;v: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;next: PEdge;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure addEdge(var l: PEdge; const v: integer);</div><div class="code_line">var t: PEdge;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;new(t);</div><div class="code_line">&nbsp;&nbsp;t.next := l;</div><div class="code_line">&nbsp;&nbsp;t.v := v;</div><div class="code_line">&nbsp;&nbsp;l := t;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;e: array[1..NMAX] of PEdge;</div><div class="code_line">&nbsp;&nbsp;m: integer;</div><div class="code_line">&nbsp;&nbsp;n: integer;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure BFS(const s, f: integer);</div><div class="code_line">var i: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;t: PInteger; </div><div class="code_line">&nbsp;&nbsp; &nbsp;cur: PEdge;</div><div class="code_line">&nbsp;&nbsp; &nbsp;min: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;queue: TQueue;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dist: array[1..NMAX] of integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;prev: array[1..NMAX] of integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;for i := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;dist[i] := INF;</div><div class="code_line">&nbsp;&nbsp; &nbsp;prev[i] := -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;prev[s] := 0;</div><div class="code_line">&nbsp;&nbsp;dist[s] := 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;queue := TQueue.Create;</div><div class="code_line">&nbsp;&nbsp;new(t);</div><div class="code_line">&nbsp;&nbsp;t^ := s;</div><div class="code_line">&nbsp;&nbsp;queue.Push(t);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;while queue.Count &#62; 0 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;t := queue.Pop;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cur := e[t^];</div><div class="code_line">&nbsp;&nbsp; &nbsp;min := t^;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while cur &#60;&#62; nil do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if dist[cur.v] &#62; dist[min] then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;prev[cur.v] := min;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dist[cur.v] := dist[min] + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;new(t);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;t^ := cur.v;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;queue.Push(t);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cur := cur.next;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for i := 1 to n - 1 do write(dist[i], &#39; &#39;);</div><div class="code_line">&nbsp;&nbsp;writeln(dist[n]);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var i, u, v: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;AssignFile(input, FIN); &nbsp; reset(input);</div><div class="code_line">&nbsp;&nbsp;AssignFile(output, FOUT); rewrite(output);</div><div class="code_line">&nbsp;&nbsp;read(n, m);</div><div class="code_line">&nbsp;&nbsp;for i := 1 to m do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;read(u, v);</div><div class="code_line">&nbsp;&nbsp; &nbsp;addEdge(e[u], v);</div><div class="code_line">&nbsp;&nbsp; &nbsp;addEdge(e[v], u);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;BFS(1, 0);</div><div class="code_line">&nbsp;&nbsp;close(input);</div><div class="code_line">&nbsp;&nbsp;close(output);</div><div class="code_line">end.</div></ol></div></div></div></div><br>
O(v + e)<br>
<br>
Rem. Здесь использована стандартная Дельфийская очередь, не используйте её никогда, т. к. она медленная&#33;<br>
<br>
<br>
<strong class='tag-b'>Алгоритм Флойда</strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">program Floyd;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;FIN &nbsp;= &#39;floyd.in&#39;;</div><div class="code_line">&nbsp;&nbsp;FOUT = &#39;floyd.out&#39;;</div><div class="code_line">&nbsp;&nbsp;INF = high(integer) div 2 - 1;</div><div class="code_line">&nbsp;&nbsp;NMAX = 300;</div><div class="code_line">&nbsp;</div><div class="code_line">var A: array[1..NMAX, 1..NMAX] of integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;i, j, k, w, n, u, v, m: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;AssignFile(input, FIN); &nbsp; reset(input);</div><div class="code_line">&nbsp;&nbsp;AssignFile(output, FOUT); rewrite(output);</div><div class="code_line">&nbsp;&nbsp;read(n, m);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for i := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;for j := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;A[i, j] := INF;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;A[i, i] := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for i := 1 to m do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;read(u, v, w);</div><div class="code_line">&nbsp;&nbsp; &nbsp;A[u, v] := w;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Ищем расстояния от всех вершин до всех</div><div class="code_line">&nbsp;&nbsp;for k := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for j := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if A[i, j] &#62; A[i, k] + A[k, j] then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A[i, j] := A[i, k] + A[k, j];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Проверяем наличие циклов отрицательного веса</div><div class="code_line">&nbsp;&nbsp;for i := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;for j := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if A[i, j] = INF then write(&#39;-1 &#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else write(A[i, j], &#39; &#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;close(input);</div><div class="code_line">&nbsp;&nbsp;close(output);</div><div class="code_line">end.</div></ol></div></div></div></div><br>
O(v^3)<br>
<br>
<strong class='tag-b'>Алгоритм Форда-Беллмана</strong><br>
<br>
Просто V-1 раз релаксируем все рёбра, на каждом шаге найдены все кратчайшие пути из i рёбер<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">program Ford_Bellman1;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;FIN &nbsp;= &#39;fordbell.in&#39;;</div><div class="code_line">&nbsp;&nbsp;FOUT = &#39;fordbell.out&#39;;</div><div class="code_line">&nbsp;&nbsp;NMAX = 200;</div><div class="code_line">&nbsp;&nbsp;INF &nbsp;= high(integer) div 2 - 1;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;PEdge = ^TEdge;</div><div class="code_line">&nbsp;&nbsp;TEdge = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;u, v, w: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;next: PEdge;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure addEdge(var l: PEdge; const u, v, w: integer);</div><div class="code_line">var t: PEdge;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;new(t);</div><div class="code_line">&nbsp;&nbsp;t.next := l;</div><div class="code_line">&nbsp;&nbsp;t.u := u;</div><div class="code_line">&nbsp;&nbsp;t.v := v;</div><div class="code_line">&nbsp;&nbsp;t.w := w;</div><div class="code_line">&nbsp;&nbsp;l := t;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;n: integer;</div><div class="code_line">&nbsp;&nbsp;m: integer;</div><div class="code_line">&nbsp;&nbsp;e: PEdge;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Ford_Bellman(const s, t: integer);</div><div class="code_line">var i, k: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cur: PEdge;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dist: array[1..NMAX] of integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;prev: array[1..NMAX] of integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;for i := 1 to n do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;dist[i] := INF;</div><div class="code_line">&nbsp;&nbsp; &nbsp;prev[i] := -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;prev[s] := 0;</div><div class="code_line">&nbsp;&nbsp;dist[s] := 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for k := 1 to n - 1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;cur := e;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 1 to m do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if dist[cur.v] &#62; dist[cur.u] + cur.w then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dist[cur.v] := dist[cur.u] + cur.w;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;prev[cur.v] := cur.u;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cur := cur.next;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for i := 1 to n - 1 do write(dist[i], &#39; &#39;);</div><div class="code_line">&nbsp;&nbsp;writeln(dist[n]);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var i, u, v, w: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;AssignFile(input, FIN); &nbsp; reset(input);</div><div class="code_line">&nbsp;&nbsp;AssignFile(output, FOUT); rewrite(output);</div><div class="code_line">&nbsp;&nbsp;read(n, m);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for i := 1 to m do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;read(u, v, w);</div><div class="code_line">&nbsp;&nbsp; &nbsp;addEdge(e, u, v, w);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Ford_Bellman(1, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;close(input);</div><div class="code_line">&nbsp;&nbsp;close(output);</div><div class="code_line">end.</div></ol></div></div></div></div><br>
O(v * e)<br>
<br>
<br>
<br>
Итак, у меня есть ещё десяток алгоритмов, пока попытаюсь найти время на пояснение этих  :rolleyes:]]></description>
        <author>Glex</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1424191</guid>
        <pubDate>Tue, 23 Jan 2007 06:13:30 +0000</pubDate>
        <title>Требуется&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1424191</link>
        <description><![CDATA[Romtek: Без <span class='tag-u'>пояснений</span> <em class='tag-i'>алгоритмом</em> и <em class='tag-i'>в коде</em> нет смысла в данных ссылках, поисковиками все умеют пользоваться.]]></description>
        <author>Romtek</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1417316</guid>
        <pubDate>Wed, 17 Jan 2007 13:27:24 +0000</pubDate>
        <title>Требуется&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1417316</link>
        <description><![CDATA[-=Makc=-: Немного о графах есть здесь: <br>
http://education.aspu.ru/page.php?id=152 <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2007-01-17T13:30:07+00:00">17.01.07, 13:30</time></span></span><br>
поиск в глубину<br>
Поиск в ширину<br>
Каркасы (стягивающие деревья)<br>
Построение стягивающего дерева поиском в глубину<br>
Построение стягивающего дерева поиском в ширину<br>
Построение всех каркасов графа<br>
Построение минимального каркаса методом Краскала: Граф задан списком ребер с указанием их весов<br>
Построение минимального каркаса методом Прима<br>
и Поиск кратчайших путей.<br>
http://education.aspu.ru/page.php?id=152 <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2007-01-17T13:31:49+00:00">17.01.07, 13:31</time></span></span><br>
Сборник исходников &quot;Алгоритмы на графах&quot; : есть много всего интересного<br>
http://borisvolfson.h11.ru/programs/graphs.rar]]></description>
        <author>-=Makc=-</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1400087</guid>
        <pubDate>Wed, 03 Jan 2007 19:03:58 +0000</pubDate>
        <title>Требуется&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1400087</link>
        <description><![CDATA[SkyStar: Обход графа в глубину:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;procedure Go (S :TMatrix);</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;i :Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;B :array[1..NMax] of Boolean;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure GoDown (m :Integer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;var i :Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;write(m);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;B[m] := true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for i:=1 to NMax do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (S[m,i]) and (not B[i]) then GoDown(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;fillchar(B,sizeof(B),0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=1 to Nmax do GoDown(i);</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
<br>
Кстати я заметил, что предыдущий алгоритм нахождения матрицы достижимости можно использовать как для орграфов так и для обычных. Но для обычных можно использовать и следующий алгоритм основанный на обходе в глубину:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure AttainAbility(var P :TMatrix; S :TMatrix);</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;B :TVector;</div><div class="code_line">&nbsp;&nbsp; &nbsp;i :Integer;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure GoDown (m :Integer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;var i :Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;B[m] := true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for i:=1 to NMax do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (not B[i]) and S[m,i] then GoDown(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=1 to NMax do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FillChar(B,SizeOf(B),0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;GoDown(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;P[i] := B;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div>]]></description>
        <author>SkyStar</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1395855</guid>
        <pubDate>Fri, 29 Dec 2006 14:53:59 +0000</pubDate>
        <title>Требуется&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1395855</link>
        <description><![CDATA[Artful Fox: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=165597&view=findpost&p=1395839'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Romtek &#064; <time class="tag-quote__quoted-time" datetime="2006-12-29T14:22:12+00:00">29.12.06, 14:22</time></span><div class='quote '>А как насчёт пояснения как и почему?.</div></div><br>
Хорошо.<br>
<br>
P - искомая матрица достижимости. Известно, что <strong class='tag-b'>P = A (булева сумма) A^2 (булева сумма) A^3 (булева сумма) .... (булева сумма) A^n</strong>, где A - матрица смежности, n - размерность матрицы (число вершин в графе), причем A^2 = A (булево произведение) A, а для общего случая<strong class='tag-b'> A^r = A (булево произведение) A^r-1</strong>. <br>
<br>
Булева сумма и произведение пишутся как и для обычных матриц.]]></description>
        <author>Artful Fox</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1395839</guid>
        <pubDate>Fri, 29 Dec 2006 14:22:12 +0000</pubDate>
        <title>Требуется&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1395839</link>
        <description><![CDATA[Romtek: <strong class='tag-b'>Artful Fox</strong>, благодарю за код.  ;)<br>
А как насчёт пояснения как и <strong class='tag-b'>почему</strong>?.]]></description>
        <author>Romtek</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1395205</guid>
        <pubDate>Thu, 28 Dec 2006 22:04:00 +0000</pubDate>
        <title>Требуется&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1395205</link>
        <description><![CDATA[Artful Fox: <strong class='tag-b'>Матрица достижимости:</strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure AttainAbility (var P :TMatrix; S :TMatrix);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, j, k :Integer;</div><div class="code_line">&nbsp;&nbsp;T :TMatrix;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{ Булева сумма }</div><div class="code_line">&nbsp;&nbsp;procedure BSum(var T :TMatrix; A, B :TMatrix);</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;i, j :Integer;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;fillchar(T, sizeof(T), 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=1 to NMax do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for j:=1 to NMax do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;T[i,j] := A[i,j] or B[i,j];</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{ Булево произведение }</div><div class="code_line">&nbsp;&nbsp;procedure BMult(var T :TMatrix; A, B :TMatrix);</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;i, j, k :Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;temp :TMatrix;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;fillchar(T, sizeof(T), 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=1 to NMax do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for j:=1 to NMax do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for k:=1 to NMax do T[i,j] := T[i,j] or (A[i,k] and B[k,j]);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;P := S; BMult(T, S, S);</div><div class="code_line">&nbsp;&nbsp;for i:=2 to NMax do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;BSum(P, P,T); BMult(T, T,S);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
S - матрица смежности<br>
P - матрица достижимости<br>
<br>
<strong class='tag-b'>Типы описаны так:</strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Const NMax = 4;</div><div class="code_line">Type</div><div class="code_line">&nbsp;&nbsp;TVector = array[1..NMax] of Boolean;</div><div class="code_line">&nbsp;&nbsp;TMatrix = array[1..NMax] of TVector;</div></ol></div></div></div></div>]]></description>
        <author>Artful Fox</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1387612</guid>
        <pubDate>Fri, 22 Dec 2006 18:12:34 +0000</pubDate>
        <title>Требуется&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1387612</link>
        <description><![CDATA[Romtek: <strong class='tag-b'>volvo877</strong>, держать копию бумажных книг не есть цель FAQ, а собирание <em class='tag-i'>наиболее популярных</em> алгоритмов и их реализация <strong class='tag-b'>на Паскале</strong>. Книгу мы не в состоянии заменить, да и нет нужды.]]></description>
        <author>Romtek</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1386867</guid>
        <pubDate>Fri, 22 Dec 2006 10:28:02 +0000</pubDate>
        <title>Требуется&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1386867</link>
        <description><![CDATA[volvo877: <strong class='tag-b'>Romtek</strong>, в книге &quot;Структуры данных и алгоритмы&quot; (Ахо, Хопрофт, Ульман) теме алгоритмов на графах посвящены 2 главы: 6-я (&quot;Ориентированные графы&quot;) и 7-я (&quot;Неориентированные графы&quot;), итого - страницы 183-227 (со схемами, примерами программ, теоретическими обоснованиями, и т.д.) Полнее вряд ли что-то можно себе представить... <br>
<br>
Можно, конечно это переконвертировать из DJVU в другой формат и выложить в FAQ-е, но что будем делать с (С)?]]></description>
        <author>volvo877</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1385637</guid>
        <pubDate>Thu, 21 Dec 2006 14:08:00 +0000</pubDate>
        <title>Требуется&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=165597&amp;view=findpost&amp;p=1385637</link>
        <description><![CDATA[Romtek: Требуется описание алгоритмов для работы с графами.<br>
<ul class="tag-list"><li>Поиск в ширину</li><li>Поиск в глубину</li><li>Вычисление матрицы достижимости</li><li>другие?</li></ul><br>
<strong class='tag-b'>Нужно описать алгоритмы и реализовать их в виде процедур, объяснив что просходит и почему.</strong>  :rolleyes: <br>
<br>
Планируется разместить их здесь: <a class='tag-url' href='http://sources.ru/wiki/doku.php?id=pascal:graph' target='_blank'>http://sources.ru/wiki/doku.php?id=pascal:graph</a><br>
<br>
Кто возьмётся?  ;)]]></description>
        <author>Romtek</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      </channel>
      </rss>
	