
Кратчайший путь на графе.
Пусть дан граф G=(X,U). Каждой дуге графа поставим в соответствие положительное число l(u). Это число можно назвать длиной дуги. Тогда за длину пути μ принимается сумма длин дуг, входящих в μ:
L(μ)= Σ l(u)
u μ
Выделяются две вершины графа – a и b. Требуется на графе G найти путь кратчайшей длины из вершины a в вершину b.
Алгоритм решения задачи:
Перенумеровать вершины графа G так, чтобы вершина a получила обозначение x0, а вершина b – xn (последняя по обозначению вершина).
Присвоить каждой вершине xi начальную метку λi: λ0=0, λi =+∞ (i>0).
Найти дугу u=uij=(xi,xj), для которой выполняется неравенство λi – λj >l(uij) (полагая, что ∞ – ∞=0). Для вершины xj заменить метку на новую, меньшую, метку λj = λj+l(uij).
Процедуру, описанную в п.3 , осуществлять до тех пор, пока для каждой дуги uij не станет справедливым неравенство λj – λi ≤l(uij)
Найти вершину xk F-1 *xn, для которой λn = λk+l(ukn), затем вершину xm F-1 *xk, для которой λk = λm+l(umk) и т.д. После некоторого числа шагов вершина xp совпадет с вершиной x0=a. Путь μ=(a= xp,…, xm, xk, xn =b) будет кратчайшим, и его длина равна λn.
Пусть дан граф:
-
x4
x5
x0
x6
x8
x7
x1
x2
x3
Решение:
-
λ0=0
λ 1=+∞
1
λ 2=+∞
4
5
7
λ 3=+∞
7
λ 4=+∞
1
λ 5=+∞
4
5
6
λ 6=+∞
4
4
6
λ 7=+∞
9
8
λ 8=+∞
10
Ответ: кратчайший путь из пункта 0 в пункт 8 составляет 10 через точки (x0, x1, x2, x7, x8).
Максимальный поток в сети.
Алгоритм решения:
Перенумеровать вершины сети, отличные от x0 и z, произвольным образом .
Построить произвольный поток φ на сети.
Рассмотреть пути, соединяющие вход x0 сети с выходом z. Если поток φ полный, то перейти к п.4. В противном случае рассмотреть путь μ, соединяющий x0 с z, все дуги которого ненасыщенны. Построить новый поток
|
φ (u), u μ, |
φ 1= |
|
|
φ (u)+k, u μ, |
Где k =min (c(u)- φ (u))
u μ
Повторить процесс до получения полного потока.
Присвоить целочисленные метки вершинам сети и знаки «+» или «–» дугам по следующим правилам:
а) входу x0 присвоить метку 0;
б) если вершина xi получила некоторую метку, а y – еще непомеченная вершина, то y приобретает метку i, а дуга – знак «+», если φ (u)<c(u);
в) если вершина xi получила некоторую метку, а y – еще непомеченная вершина, то y приобретает метку i, а дуга – знак «–», если φ (u)>0. Остальные непомеченные вершины и дуги меток и знаков не получают;
г) повторить процесс, описанный в п.4 б, в, до тех пор, пока не прекратиться появление новых отмеченных вершин и дуг. Если в результате этого процесса вершина z не получит метки, то поток обладает наибольшей величиной, в противном случае перейти к п.5
Рассмотреть последовательность отмеченных вершин λ=(z, xi, xk, xp,…, x0), каждая из которых имеет метку, равную номеру последующей вершины, и последовательность дуг μ (не обязательно путь), соединяющих последовательные вершины из λ. Построить новый поток
-
φ (u), u μ,
φ =
φ (u)+1, u μ и имеет знак «+»,
φ (u)-1, u μ и имеет знак «–»,
и перейти к п.4.
Задача:
-
x6
x5
x0
x4
x7
x1
x2
x3
Ответ:
-
x6
x5
x0
x4
x7
x1
x2
x3
Максимальное количество ед. – 6.