<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://lib.custis.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AntMatrik</id>
		<title>CustisWiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://lib.custis.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AntMatrik"/>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/AntMatrik"/>
		<updated>2026-04-10T11:35:08Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.26.4</generator>

	<entry>
		<id>https://lib.custis.ru/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BA%D1%80%D0%B0%D1%82%D1%87%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D0%BF%D1%83%D1%82%D0%B5%D0%B9:%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A4%D0%BB%D0%BE%D0%B9%D0%B4%D0%B0-%D0%A3%D0%BE%D1%80%D1%88%D0%BE%D0%BB%D0%BB%D0%B0&amp;diff=2759</id>
		<title>Поиск кратчайших путей:алгоритм Флойда-Уоршолла</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BA%D1%80%D0%B0%D1%82%D1%87%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D0%BF%D1%83%D1%82%D0%B5%D0%B9:%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A4%D0%BB%D0%BE%D0%B9%D0%B4%D0%B0-%D0%A3%D0%BE%D1%80%D1%88%D0%BE%D0%BB%D0%BB%D0%B0&amp;diff=2759"/>
				<updated>2006-06-20T21:12:26Z</updated>
		
		<summary type="html">&lt;p&gt;AntMatrik: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Алгоритм Флойда-Уоршолла (Floyd-Warshall) предназначен для решения задачи поиска кратчайших путей в графе — ''Shortest Path Problem''. В отличие от [[Поиск кратчайших путей:алгоритм Дейкстры|алгоритма Дейкстры]], он находит все кратчайшие пути в графе, к тому же, допускает наличие отрицательных весов (расстояний) на ребрах графа, при условии, что в графе не образуется циклов отрицательной длины (т. е. невозможно бесконечно уменьшать расстояние между некоторыми точками).&lt;br /&gt;
&lt;br /&gt;
В этом алгоритме, для графа &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; последовательно выполняются &amp;lt;math&amp;gt;n=|V|&amp;lt;/math&amp;gt; итераций, улучшая матрицу &amp;lt;math&amp;gt;D_{ij}&amp;lt;/math&amp;gt; минимальных стоимостей пути из вершины ''i'' в вершину ''j'', с возможным использованием (для ''k''-той итерации) промежуточных вершин из множества &amp;lt;math&amp;gt;1,\dots,k&amp;lt;/math&amp;gt;. Вычислять эту матрицу очень легко, изначально она определяется весовой функцией ребер, &amp;lt;math&amp;gt;D^0_{ij}=w_{ij}&amp;lt;/math&amp;gt;, для тех ''i'' и ''j'', для которых есть ребро ''(i,j)'', и &amp;lt;math&amp;gt;+\infty&amp;lt;/math&amp;gt; для остальных.&lt;br /&gt;
Обновление этой матрицы на ''k''-той итерации происходит по очевидной формуле:&lt;br /&gt;
&amp;lt;math&amp;gt;D^k_{ij}=min(D^{k-1}_{ij},D^{k-1}_{ik}+D^{k-1}_{kj})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D^{k-1}&amp;lt;/math&amp;gt; — значение этой матрицы на предыдущей итерации.&lt;br /&gt;
Таким образом, очевидна и корректность алгоритма, и его сложность, состовляющая &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-python&amp;gt;&lt;br /&gt;
# Находит стоимость кратчайшего пути для всех пар вершин.&lt;br /&gt;
# Выбор и хранение самих оптимальных путей не показаны для простоты. &lt;br /&gt;
def floyd_warshal(G):&lt;br /&gt;
    N = G.number_of_nodes()&lt;br /&gt;
    # Инициализируем матрицу $D$ расстояниями, используем $777$ как $\infty$.&lt;br /&gt;
    D = (ones((N,N))-identity(N))*777&lt;br /&gt;
    for e in G.edges():&lt;br /&gt;
        D[e[0],e[1]]=e[2]&lt;br /&gt;
    print D    &lt;br /&gt;
    for k in range(0,N):&lt;br /&gt;
        print; print &amp;quot;Iteration: k=&amp;quot;,k&lt;br /&gt;
        D_old=array(D)              #Сохраняем $D_{k-1}$ в $D_{old}$&lt;br /&gt;
        for v1 in range(0,N):&lt;br /&gt;
            for v2 in range (0,N):&lt;br /&gt;
                D[v1,v2]=min(D[v1,v2],D_old[v1,k]+D_old[k,v2])    &lt;br /&gt;
        if D&amp;lt;&amp;gt;D_old:&lt;br /&gt;
            print D-D_old        &lt;br /&gt;
        else:&lt;br /&gt;
            print &amp;quot;D remains unchanged&amp;quot;&lt;br /&gt;
    print; print; print D&lt;br /&gt;
    return D&lt;br /&gt;
&amp;lt;/code-python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[  0,777,777,777, 80,]&lt;br /&gt;
  [ 60,  0, -5, 50, 10,]&lt;br /&gt;
  [777, 10,  0,777,777,]&lt;br /&gt;
  [ 50, 30, 20,  0, 30,]&lt;br /&gt;
  [777, 15, 15,777,  0,]]&lt;br /&gt;
&lt;br /&gt;
 Iteration: k= 0&lt;br /&gt;
 D remains unchanged&lt;br /&gt;
&lt;br /&gt;
 Iteration: k= 1&lt;br /&gt;
 [[   0,   0,  -5,   0,   0,]&lt;br /&gt;
  [   0,   0,   0,   0,   0,]&lt;br /&gt;
  [-707,   0,   0,-717,-757,]&lt;br /&gt;
  [   0,   0,   0,   0,   0,]&lt;br /&gt;
  [-702,   0,  -5,-712,   0,]]&lt;br /&gt;
&lt;br /&gt;
 Iteration: k= 2&lt;br /&gt;
 D remains unchanged&lt;br /&gt;
&lt;br /&gt;
 Iteration: k= 3&lt;br /&gt;
 D remains unchanged&lt;br /&gt;
&lt;br /&gt;
 Iteration: k= 4&lt;br /&gt;
 [[   0,-682,-682,-632,   0,]&lt;br /&gt;
  [   0,   0,   0,   0,   0,]&lt;br /&gt;
  [   0,   0,   0,   0,   0,]&lt;br /&gt;
  [   0,   0,   0,   0,   0,]&lt;br /&gt;
  [   0,   0,   0,   0,   0,]]&lt;br /&gt;
&lt;br /&gt;
 [[  0, 95, 90,145, 80,]&lt;br /&gt;
  [ 60,  0, -5, 50, 10,]&lt;br /&gt;
  [ 70, 10,  0, 60, 20,]&lt;br /&gt;
  [ 50, 30, 20,  0, 30,]&lt;br /&gt;
  [ 75, 15, 10, 65,  0,]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph G{ rankdir=TB; &lt;br /&gt;
 0 [label=&amp;quot;NY(0)&amp;quot;];&lt;br /&gt;
 1 [label=&amp;quot;Moscow(1)&amp;quot;];&lt;br /&gt;
 2 [label=&amp;quot;Minsk(2)&amp;quot;];&lt;br /&gt;
 3 [label=&amp;quot;Berlin(3)&amp;quot;];&lt;br /&gt;
 4 [label=&amp;quot;Kiev(4)&amp;quot;];&lt;br /&gt;
 0 -&amp;gt; 4[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$80&amp;quot;,style=solid]; &lt;br /&gt;
 1 -&amp;gt; 0[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$60&amp;quot;,style=solid]; &lt;br /&gt;
 3 -&amp;gt; 0[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$50&amp;quot;,style=solid]; &lt;br /&gt;
 1 -&amp;gt; 2[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$-5&amp;quot;,style=solid]; &lt;br /&gt;
 1 -&amp;gt; 3[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$50&amp;quot;,style=solid]; &lt;br /&gt;
 1 -&amp;gt; 4[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$10&amp;quot;,style=solid]; &lt;br /&gt;
 2 -&amp;gt; 1[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$10&amp;quot;,style=solid]; &lt;br /&gt;
 3 -&amp;gt; 1[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$30&amp;quot;,style=solid]; &lt;br /&gt;
 4 -&amp;gt; 1[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$15&amp;quot;,style=solid]; &lt;br /&gt;
 3 -&amp;gt; 2[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$20&amp;quot;,style=solid]; &lt;br /&gt;
 4 -&amp;gt; 2[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$15&amp;quot;,style=solid]; &lt;br /&gt;
 3 -&amp;gt; 4[fontcolor=&amp;quot;blue&amp;quot;,label=&amp;quot;$30&amp;quot;,style=solid]; &lt;br /&gt;
 0 -&amp;gt; 1[fontcolor=&amp;quot;red&amp;quot;,label=&amp;quot;$95&amp;quot;,style=dashed]; &lt;br /&gt;
 0 -&amp;gt; 2[fontcolor=&amp;quot;red&amp;quot;,label=&amp;quot;$90&amp;quot;,style=dashed]; &lt;br /&gt;
 0 -&amp;gt; 3[fontcolor=&amp;quot;red&amp;quot;,label=&amp;quot;$145&amp;quot;,style=dashed]; &lt;br /&gt;
 2 -&amp;gt; 0[fontcolor=&amp;quot;red&amp;quot;,label=&amp;quot;$70&amp;quot;,style=dashed]; &lt;br /&gt;
 2 -&amp;gt; 3[fontcolor=&amp;quot;red&amp;quot;,label=&amp;quot;$60&amp;quot;,style=dashed]; &lt;br /&gt;
 2 -&amp;gt; 4[fontcolor=&amp;quot;red&amp;quot;,label=&amp;quot;$20&amp;quot;,style=dashed]; &lt;br /&gt;
 4 -&amp;gt; 0[fontcolor=&amp;quot;red&amp;quot;,label=&amp;quot;$75&amp;quot;,style=dashed]; &lt;br /&gt;
 4 -&amp;gt; 2[fontcolor=&amp;quot;red&amp;quot;,label=&amp;quot;$10&amp;quot;,style=dashed]; &lt;br /&gt;
 4 -&amp;gt; 3[fontcolor=&amp;quot;red&amp;quot;,label=&amp;quot;$65&amp;quot;,style=dashed]; &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
{{replicate-from-custiswiki-to-lib}}&lt;/div&gt;</summary>
		<author><name>AntMatrik</name></author>	</entry>

	</feed>