К содержанию

Задание 23 · Анализ графов

Практика и итог

Вся тема на одной странице: как решилась задача темы, главное из подтем, порядок решения и частые ошибки.

Одна задача — вся тема

Задача темы — кратчайший путь из 1 в 100 в графе из файла 23-5.txt — прошла через подтемы, и каждая добавляла к решению новый шаг. Пролистай черновик: точками отмечены строки, которых не было после предыдущей подтемы.

  1. Подтема 1, «Граф и путь»: ребро — строка, длина — сумма весов. Точками отмечены новые строки.
  2. Подтема 2, «Лучший путь до цели»: f(v) — через ответы соседей.
  3. Подтема 3, «Программа с @cache»: словарь рёбер и @cache.
  4. Подтема 4, «Условия на путь»: условие — разрез пути. Ответ задачи темы — 10211.

Функция f остаётся той же — вопрос меняет только три места в ней или её аргументы. Подтема 5 считает число путей, самый длинный путь и число рёбер, а дополнительный урок — пути ровно из k рёбер.

Карта темы

Каждая подтема дала одно правило функции, и любое решение собирается из них. Сверху — путь от файла к ответу, ниже — по блоку на подтему. Заголовок блока ведёт на подтему.

  1. Графсловарь: вершина → (куда, вес)
  2. Функцияf(v) через f соседей, @cache
  3. Ответf(1), целая часть в конце

1Граф и путь

  • строка «a b w»ребро из a в b весом w, только в одну сторону
  • длина путисумма весов, а не число рёбер

2Лучший путь до цели

  • f(цели)0 — уже на месте
  • f(v)min(вес + f(конца)) по стрелкам из v
  • тупик∞, а не 0

3Программа с @cache

  • line.split()без аргумента — любые пробелы и табуляции
  • graph.get(v, [])стрелки из v; у тупика пусто
  • @cacheкаждая вершина считается один раз

4Условия на путь

  • через kf(s, k) + f(k, t)
  • в обход kв k вернуть ∞
  • через ребро a → bf(s, a) + вес + f(b, t)

5Другие вопросы о путях

  • число путейв цели 1, сумма вместо min
  • самый длинныйmax, в тупике −∞
  • число рёбервместо веса 1

6Условие на число рёбердополнительный урок

  • f(v, k)путь ровно из k рёбер
Карта темы: путь к ответу сверху и главное из каждой подтемы. Номер блока — номер подтемы.

Как решать

Любое задание 23 решается одним порядком из пяти шагов. Каждому шагу ты уже учился — под ним номера подтем:

Главный шаг — правило f: длина лучшего пути от вершины до цели через ответы соседей. Проверка — учебный граф из восьми рёбер: f(1) = 7.5 и f(6) = 8.5.

Перед ответом выведи само число, а не только целую часть: так видно и бесконечность, и почти целую сумму вроде 4519.999999999998.

Частые ошибки

Шесть ошибок встречаются чаще других, и каждую ловит один вопрос к себе. Выбери ошибку — увидишь, как её исправить, и вопрос, который её ловит:

тупик — ноль
в тупике f = 0 → float("inf"). Спроси себя: можно ли из этой вершины дойти до цели?подтема 2
целая часть рано
веса переведены в int при чтении → вес — float, int только от итоговой суммы. Спроси себя: не потерялись ли дробные части весов?подтема 3
round вместо int
round(12.6) → int(12.6). Спроси себя: просят целую часть или округление?подтема 3
split(" ")
line.split(" ") → line.split(). Спроси себя: нет ли в строке двух пробелов или табуляции?подтема 3
нет @cache
программа на файле не заканчивается → @cache над функцией. Спроси себя: не считается ли одна вершина много раз?подтема 3
запрет в старой функции
запрет добавили в уже вызванную f → для запрета — своя функция. Спроси себя: не вернёт ли @cache старые ответы?подтема 4

Итог

Тема пройдена: задача темы решена от ребра в строке до ответа 10211. Вот что взять с собой.

  • ПорядокГраф, правило, края, вопрос, ответ.
  • Правилоf(v) = min(вес + f(конца)), @cache.
  • КраяВ цели 0, в тупике ∞.
  • УсловияЧерез вершину — сумма двух f, в обход — ∞ в ней.
  • Задача темыint(f(1)) = 10211; учебный граф — 7.5.

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1

Из вершины 5 выходят рёбра в 9 весом 2 и в 12 весом 7; f(9) = 10, f(12) = 4. Чему равно f(5)?

ОтветСкрыть ответ
Ответ

min(2 + 10, 7 + 4) = 11.

Вопрос 2

Почему в тупике f = ∞, а не 0?

ОтветСкрыть ответ
Ответ

0 значит «уже в цели». Из тупика до цели не дойти, и такой путь не должен победить в min.

Вопрос 3

Как найти кратчайший путь из 1 в 100 через вершину 4?

ОтветСкрыть ответ
Ответ

f(1, 4) + f(4, 100): путь делится вершиной 4 на два независимых участка.

Вопрос 4

Нужно не длину пути, а число путей. Что меняется в функции?

ОтветСкрыть ответ
Ответ

В цели 1 вместо 0, в тупике 0, а вместо min — сумма ответов соседей без весов.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Количество путей

В текстовом файле 23-4.txt содержится описание ациклического ориентированного взвешенного графа: в каждой строке — номер начальной вершины ребра, номер конечной вершины и вес ребра; числа разделены пробелами и/или табуляциями. Определите количество различных путей из вершины 1 в вершину 100.

23-4.txtАциклический ориентированный граф: в строке — начало ребра, конец и весТекстовый файл · 1,1 КБ

Введите число.

Кратчайший путь по файлу 23-3

В текстовом файле 23-3.txt содержится описание ациклического ориентированного взвешенного графа: в каждой строке — номер начальной вершины ребра, номер конечной вершины и вес ребра; числа разделены пробелами и/или табуляциями. Найдите длину кратчайшего пути из вершины 1 в вершину 100. В ответ запишите целую часть найденной длины.

23-3.txtАциклический ориентированный граф: в строке — начало ребра, конец и весТекстовый файл · 2,4 КБ

Введите целую часть найденной длины.

Путь без запрещённой вершины

В текстовом файле 23-5.txt содержится описание ациклического ориентированного взвешенного графа: в каждой строке — номер начальной вершины ребра, номер конечной вершины и вес ребра; числа разделены пробелами и/или табуляциями. Найдите длину кратчайшего пути из вершины 1 в вершину 100, не проходящего через вершину 722. В ответ запишите целую часть найденной длины.

23-5.txtАциклический ориентированный граф: в строке — начало ребра, конец и весТекстовый файл · 3,2 КБ

Введите целую часть найденной длины.

Граф с тупиками

В текстовом файле 23-6.txt содержится описание ациклического ориентированного взвешенного графа: в каждой строке — номер начальной вершины ребра, номер конечной вершины и вес ребра; числа разделены пробелами и/или табуляциями. Найдите длину кратчайшего пути из вершины 1 в вершину 100. В ответ запишите целую часть найденной длины.

23-6.txtАциклический ориентированный граф: в строке — начало ребра, конец и весТекстовый файл · 3,0 КБ

Введите целую часть найденной длины.

Путь через обязательную вершину

В текстовом файле 23-6.txt содержится описание ациклического ориентированного взвешенного графа: в каждой строке — номер начальной вершины ребра, номер конечной вершины и вес ребра; числа разделены пробелами и/или табуляциями. Найдите длину кратчайшего пути из вершины 1 в вершину 100, проходящего через вершину 429. В ответ запишите целую часть найденной длины.

23-6.txtАциклический ориентированный граф: в строке — начало ребра, конец и весТекстовый файл · 3,0 КБ

Введите целую часть найденной длины.