<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Daria+Yakovleva%2C+1539</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Daria+Yakovleva%2C+1539"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%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/Daria_Yakovleva,_1539"/>
		<updated>2026-06-11T18:40:51Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%80%D0%B0%D1%82%D1%87%D0%B0%D0%B9%D1%88%D0%B8%D0%B9_%D0%BF%D1%83%D1%82%D1%8C_%D0%B2_%D0%B0%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=34362</id>
		<title>Кратчайший путь в ациклическом графе</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%80%D0%B0%D1%82%D1%87%D0%B0%D0%B9%D1%88%D0%B8%D0%B9_%D0%BF%D1%83%D1%82%D1%8C_%D0%B2_%D0%B0%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=34362"/>
				<updated>2013-12-17T20:06:07Z</updated>
		
		<summary type="html">&lt;p&gt;Daria Yakovleva, 1539: /* Решение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пусть дан ациклический ориентированный взвешенный граф. Требуется найти вес кратчайшего пути из '''u''' в '''v''' &lt;br /&gt;
{{Определение|definition= '''Кратчайший путь''' из '''u''' в '''v''' – это такой путь из '''u '''в '''v''', что его суммарный вес входящих в него ребер минимален}}&lt;br /&gt;
==Решение==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; — функция, где &amp;lt;tex&amp;gt;d(i)&amp;lt;/tex&amp;gt; — вес кратчайшего пути из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Ясно, что &amp;lt;tex&amp;gt;d(u)&amp;lt;/tex&amp;gt; равен 0. Пусть &amp;lt;tex&amp;gt;w(i, j)&amp;lt;/tex&amp;gt; - вес ребра из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;. Будем обходить граф в порядке [[Использование_обхода_в_глубину_для_топологической_сортировки | топологической сортировки]]. Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt; d(i) = \min\limits_{\mathop{j:j \rightsquigarrow i}} (d(j) + w(j, i)) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы обходим граф в порядке топологической сортировки, то на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге всем &amp;lt;tex&amp;gt;d(j)&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; такие, что существует ребро из &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;) уже присвоены оптимальные ответы, и, следовательно, &amp;lt;tex&amp;gt;d(i)&amp;lt;/tex&amp;gt; также будет присвоен оптимальный ответ.&lt;br /&gt;
&lt;br /&gt;
==Реализация==&lt;br /&gt;
Реализуем данный алгоритм:&lt;br /&gt;
  //w - матрицы как в описании, d - массив как в описании, p - массив индексов вершин графа в порядке топологической сортировки, i, j - счетчики &amp;lt;br /&amp;gt;&lt;br /&gt;
  inputData() //считывание данных &amp;lt;br /&amp;gt;&lt;br /&gt;
  for i = 1 to n&lt;br /&gt;
    d[i] = infinity &amp;lt;br /&amp;gt;&lt;br /&gt;
  p = topSort(w) //топологическая сортировка графа &amp;lt;br /&amp;gt;&lt;br /&gt;
  d[u] = 0 &amp;lt;br /&amp;gt;&lt;br /&gt;
  for i = 1 to n&lt;br /&gt;
    for j: есть ребро из p[i] в j&lt;br /&gt;
      d[j] = min(d[j], d[p[i]] + w[p[i]][j]) &amp;lt;br /&amp;gt;&lt;br /&gt;
  writeData(); // запись данных&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
[[Файл:Index1.jpg|thumb|right|180px|граф из примера]]&lt;br /&gt;
Пусть дан граф со следующими весами '''w''' ребер: &amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| || '''1''' || '''2''' || '''3''' || '''4''' || '''5''' || '''6''' || '''7''' || '''8'''&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' ||  -  ||  -  ||  -  ||  5  ||  -  ||  -  ||  -  ||  - &lt;br /&gt;
|-&lt;br /&gt;
| '''2''' ||  1  ||  -  ||  1  ||  -  ||  4  ||  3  ||  -  ||  - &lt;br /&gt;
|-&lt;br /&gt;
| '''3''' ||  -  ||  -  ||  -  ||  -  ||  -  ||  1  ||  -  ||  - &lt;br /&gt;
|-&lt;br /&gt;
| '''4''' ||  -  ||  -  ||  -  ||  -  ||  -  ||  -  ||  -  ||  - &lt;br /&gt;
|-&lt;br /&gt;
| '''5''' ||  -  ||  -  ||  -  ||  3  ||  -  ||  -  ||  -  ||  1 &lt;br /&gt;
|-&lt;br /&gt;
| '''6''' ||  -  ||  -  ||  -  ||  5  ||  -  ||  -  ||  2  ||  - &lt;br /&gt;
|-&lt;br /&gt;
| '''7''' ||  -  ||  -  ||  -  ||  2  ||  -  ||  -  ||  -  ||  - &lt;br /&gt;
|-&lt;br /&gt;
| '''8''' ||  -  ||  -  ||  -  ||  1  ||  -  ||  -  ||  -  ||  - &lt;br /&gt;
|}&lt;br /&gt;
Требуется найти путь из '''2''' в '''4'''. &amp;lt;br /&amp;gt;&lt;br /&gt;
Массив p будет выглядеть следующим образом: &amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || '''2''' || '''3''' || '''4''' || '''5''' || '''6''' || '''7''' || '''8'''&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 3 || 6 || 7 || 1 || 5 || 8 || 4&lt;br /&gt;
|}&lt;br /&gt;
Массив d будет выглядеть следующим образом:  &amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || '''2''' || '''3''' || '''4''' || '''5''' || '''6''' || '''7''' || '''8'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 1 || 5 || 3 || 2 || 4 || 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ответ равен 5.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://www.ics.uci.edu/~eppstein/161/960208.html Алгоритмы поиска кратчайшего пути в графе]&lt;br /&gt;
*[[Динамическое_программирование#.D0.9F.D1.80.D0.B8.D0.BD.D1.86.D0.B8.D0.BF_.D0.BE.D0.BF.D1.82.D0.B8.D0.BC.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_.D0.BD.D0.B0_.D0.BF.D1.80.D0.B5.D1.84.D0.B8.D0.BA.D1.81.D0.B5|Принцип оптимальности на префиксе]]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Optimal_substructure Принцип оптимальности на подзадаче (в качестве примера разбирается задача поиска кратчайшего пути в ациклическом графе)(англ.)]&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Daria Yakovleva, 1539</name></author>	</entry>

	</feed>