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

e-maxx algorithm original: C/C++ #algorithm #connectivity #emaxx #graph
Task text is translated from Russian for the selected interface language. Code is left unchanged.

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

Definition

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

с

vertexми и

рёбрами.

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

graphа

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

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

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

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

и

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

и

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

и

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

.

Свойства

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

истоком,

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

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 Algorithmа при использовании \edmonds_karp{Algorithmа Эдмондса-Карпа нахождения максимального

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

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

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

Специальный Algorithm

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

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

или

.

References

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

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

C# solution

auto-draft, review before submit
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++ solution

matched/original
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 solution

auto-draft, review before submit
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);
            }
}

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

Vacancies for this task

Active vacancies with overlapping task tags are shown.

All vacancies
There are no active vacancies yet.