Upgrade to Pro — share decks privately, control downloads, hide ads and more …

САКОД – 2 курс весна 2021 – 7.2 занятие

САКОД – 2 курс весна 2021 – 7.2 занятие

ТиМПИ

April 06, 2021
Tweet

More Decks by ТиМПИ

Other Decks in Programming

Transcript

  1. Задачи распределения, сопоставления и сечения 6 апреля 2021 [email protected], [email protected]

    Анастасия Олеговна Хлобыстова, Максим Викторович Абрамов
  2. 2/14 s t 𝑐𝑢𝑣 — пропускная способность ребра u→v 8

    6 4 9 5 8 7 10 5 𝑓𝑢𝑣 — поток по ребру u→v 0 ≤ 𝑓𝑢𝑣 ≤ 𝑐𝑢𝑣 3/ 5/ 0/ 2/ 1/ 5/ 2/ 4/ 4/ ෍ 𝑢 𝑓𝑢𝑣 = ෍ 𝑢′ 𝑓𝑣𝑢′ 𝑣 ∀𝑣: 𝑣 ≠ 𝑠, 𝑡 Постановка задачи
  3. s t 8 6 4 9 5 8 7 10

    5 3/ 5/ 0/ 2/ 1/ 5/ 2/ 4/ 4/ 𝐹 — величина потока, 𝐹 = σ𝑣 𝑓𝑠𝑣 = σ𝑢 𝑓𝑢𝑡 𝑚𝑎𝑥 𝐹 3/14 Задача о максимальном потоке
  4. 4/14 s t 8 6 4 9 5 8 7

    10 5 𝑐 — стоимость разреза 𝑚𝑖𝑛 𝑐 4+8+5=17 Задача о минимальном разрезе
  5. 5/14 m𝑎𝑥 𝐹 = 𝑚𝑎𝑥 ෍ 𝑣 𝑓𝑠𝑣 s t

    8 6 4 9 5 8 7 10 5 3/ 5/ 0/ 2/ 1/ 5/ 2/ 4/ 4/ 𝑓𝑢𝑣 ≤ 𝑐𝑢𝑣 ෍ 𝑢 𝑓𝑢𝑣 = 0 ∀𝑢: 𝑢 ≠ 𝑠, 𝑡 𝑓𝑢𝑣 = − 𝑓𝑣𝑢 Модификация постановки задачи
  6. 6/14 m𝑎𝑥 𝐹 = 𝑚𝑎𝑥 ෍ 𝑣 𝑓𝑠𝑣 s t

    8 6 4 9 5 8 7 10 5 3/ 5/ 0/ 2/ 1/ 5/ 2/ 4/ 4/ 1) 𝑓𝑢𝑣 = 0 2) увеличиваем, пока можно t s 𝑓𝑢𝑣<𝑐𝑢𝑣 s t +1 +1 +1 −1 −1 −1 𝑓𝑢𝑣 ≤ 𝑐𝑢𝑣 ෍ 𝑢 𝑓𝑢𝑣 = 0 ∀𝑢: 𝑢 ≠ 𝑠, 𝑡 𝑓𝑢𝑣 = − 𝑓𝑣𝑢 Концепция решения
  7. 7/14 𝑐′𝑢𝑣 > 0 — остаточная сеть 1 шаг 2

    шаг 𝑐′𝑢𝑣 =𝑐𝑢𝑣 − 𝑓𝑢𝑣 3 шаг t s ∆= min 𝑐′𝑢𝑣 ∆ −∆ −∆ −∆ ∆ ∆ Алгоритм Форда-Фалкерсона
  8. 8/14 s t 8 6 4 9 5 8 7

    10 5 5/ 5/ 5/ 5/ 5/ Пример
  9. 9/14 s t 3 1 4 9 0 8 2

    10 0 5 5/ 5/ 5/ 5/ 5/8 6 5 7 5 5 5 5 5 Пример: что получаем в остаточной сети?
  10. 10/14 s t 3 1 4 9 0 8 2

    10 0 5 5/ 5/ 5/ 5/ 5/8 6 5 7 5 5 5 5 5 4/ 4/ 4/ 4/ 4/ Пример
  11. 11/14 s t 3 1 4 9 8 2 10

    5 5 5 5 5 4/ 4/ 4/ 4/ 4/ 4 4 5 6 6 F — максимальный поток Нет пути из s в t <=> s t 𝑐 — стоимость разреза 𝐹′ — поток 𝐹′ ≤ 𝑐 Пример: что получаем в остаточной сети?
  12. 13/14 • Задачи распределения (distribution) • Задачи сопоставления (matching) •

    Задачи сечения (cut) • Задача о трудоустройстве • Радарная система слежения • Распределение товаров • Обмен данными • Транспортные потоки • Надежность сети • Отсечение линий снабжения Модели сетевых потоков, алгоритмов и реализаций
  13. Задачи распределения, сопоставления и сечения 6 апреля 2021 [email protected], [email protected]

    Анастасия Олеговна Хлобыстова, Максим Викторович Абрамов
  14. 15/16 Полезные ссылки • Потоки, разрезы. Алгоритм Форда-Фалкерсона • Потоки.

    Алгоритмы Эдмонса-Карпа и Диница. Масштабирование потока
  15. 16/16 void ford_fulkerson(vector<Node*>& graph, int src, int dst) { while

    (true) { list<Edge*> path; list<int> visited; if (dfs(graph, src, dst, path, visited) == false) break; int min_flow = 1; for (auto edge : path) { edge->flow += min_flow; auto* antiEdge = get_edge(graph, edge->to_number, edge->from_number); antiEdge->flow -= min_flow; } } } struct Node { int number; vector<Edge*> adjacent; // список инцидентности } struct Edge { int from_number; // номер узла, из которого выходит дуга int to_number; // номер узла, в который входит дуга int flow; // поток через дугу int flow_capacity; // пропускная способность дуги int residual_flow() { return flow_capacity - flow; } } Edge* get_edge(vector<Node*>& graph, int src, int dst) { auto& adjacent = graph[src]->adjacent; for (auto edge : adjacent) { if (edge->to_number == dst) return edge; } return nullptr; } Алгоритм Форда-Фалкерсона