E067. Рёберная связность. Свойства и нахождение

e-maxx algorithm original: C/C++ #algorithm #connectivity #emaxx #graph
题目文本会按所选界面语言从俄语翻译;代码保持不变。

Источник: e-maxx.ru/algo, страница PDF 204.

定义

Пусть дан неориентированный 图

с

vertexми и

рёбрами.

Рёберной связностью

图а

называется наименьшее number рёбер, которое нужно удалить, чтобы

图 перестал быть связным. На示例, для несвязного 图а рёберная связность равна нулю. Для связного 图а с единственным мостом рёберная связность равна единице.

Говорят, что множество

рёбер разделяет вершины

и

, если при удалении этих рёбер из 图а вершины

и

оказываются в разных компонентах связности. Ясно, что рёберная связность 图а равна минимуму от наименьшего числа рёбер, разделяющих две вершины

и

, взятому среди всевозможных пар

.

Свойства

Соотношение Уитни

Соотношение Уитни (Whitney) (1932 г.) между рёберной связностью

, вершинной связностью

и наименьшей из степеней вершин

: Докажем это утверждение. Докажем сначала первое неравенство:

. Рассмотрим этот набор из

рёбер, делающих 图 несвязным. Если

мы возьмём от каждого из этих ребёр по одному концу (любому из двух) и удалим из 图а, то тем самым с помощью удалённых вершин (поскольку одна и та же vertex могла встретиться дважды) мы сделаем 图 несвязным.

Таким образом,

. Докажем второе неравенство: . Рассмотрим вершину минимальной степени, тогда мы можем удалить все смежных с ней рёбер и тем самым отделить эту вершину от всего остального 图а. Следовательно, . Интересно, что неравенство Уитни нельзя улучшить: т.е. для любых троек чисел, удовлетворяющих этому неравенству, существует хотя бы один соответствующий 图. См. задачу "Построение 图а с указанными величинами вершинной и рёберной связностей и наименьшей из степеней вершин".

Теорема Форда-Фалкерсона

Теорема Форда-Фалкерсона (1956 г.): Для любых двух вершин наибольшее number рёберно-непересекающихся цепей, соединяющих их, равно наименьшему числу рёбер, разделяющих эти вершины.

Нахождение рёберной связности

Простой 算法 на основе поиска максимального потока

Этот способ основан на теореме Форда-Фалекрсона.

Мы должны перебрать все пары вершин

, и между каждой парой find наибольшее number непересекающихся

по рёбрам путей. Эту величину можно find с помощью 算法а максимального потока: мы делаем

истоком,

— стоком, а пропускную способность каждого ребра кладём равной 1. Таким образом, псевдокод 算法а таков:

int ans = INF;
for (int s=0; s<n; ++s)
for (int t=s+1; t<n; ++t) {
int flow = ... величина максимального потока из s в t ...

ans = min (ans, flow);

} Asymptotic complexity 算法а при использовании \edmonds_karp{算法а Эдмондса-Карпа нахождения максимального

потока} получается

, однако следует заметить, что скрытая в асимптотике

константа весьма мала, поскольку практически невозможно создать такой 图, чтобы 算法 нахождения максимального потока работал медленно сразу при всех стоках и истоках. Особенно быстро такой 算法 будет работать на случайных 图ах.

Специальный 算法

Используя потоковую терминологию, данная 题目 — это 题目 поиска глобального минимального разреза. Для её решения разработаны специальные 算法ы. На данном сайте представлен один из которых — 算法

Штор-Вагнера, работающий за время

или

.

References

● Hassler Whitney. Congruent Graphs and the Connectivity of Graphs [1932]

● Фрэнк Харари. Теория 图ов [2003]

C# 解法

自动草稿,提交前请检查
using System;
using System.Collections.Generic;
using System.Linq;

public static class AlgorithmDraft
{
    // Auto-generated C# draft from the original e-maxx C/C++ listing. Review before production use.
    int ans = INF;
    for (int s=0; s<n; ++s)
            for (int t=s+1; t<n; ++t) {
                    int flow = ... величина максимального потока из s в t ...
                    ans = min (ans, flow);
            }
}

C++ 解法

匹配/原始
int ans = INF;
for (int s=0; s<n; ++s)
        for (int t=s+1; t<n; ++t) {
                int flow = ... величина максимального потока из s в t ...
                ans = min (ans, flow);
        }

Java 解法

自动草稿,提交前请检查
import java.util.*;
import java.math.*;

public class AlgorithmDraft {
    // Auto-generated Java draft from the original e-maxx C/C++ listing. Review before production use.
    int ans = INF;
    for (int s=0; s<n; ++s)
            for (int t=s+1; t<n; ++t) {
                    int flow = ... величина максимального потока из s в t ...
                    ans = min (ans, flow);
            }
}

Материал разбит как 算法ическая 题目: изучить постановку, понять асимптотику и реализовать 算法 на выбранном языке.

Vacancies for this task

活跃职位 with overlapping task tags are 已显示.

所有职位
目前还没有活跃职位。