32-сурет. Форд-Беллман алгоритмінің жұмысы
8.10 Дейкстра алгоритмі
Екі маңызды жағдай үшін эффективтірек алгоритмдер бар:
1) барлық доғалар салмақтары теріс емес;
2) графта контурлар жоқ.
Бірінші жағдай үшін бізге белгілі Дейкстра алгоритмі орынды болады.
Жалпыланған түрде ол былай жазылуы мүмкін.
1
BEGIN
2 FOR v
∈
V DO D[v] := a[s, v]; D[s] := 0;
3 T:=V\{s};
4 WHILE T
DO
≠
∅
5
BEGIN
6 u := ерікті t
∈
T шыңы, D[t]=min{D[p],p
∈
T} болады;
7 T:=T\{u};
8 FOR v
∈
Т DO D[v] - min(D[v], D[u]+a[u, v])
9
END
10 END
Алгоритмнің жұмысын түсіндіру үшін 4-циклдің инварианті болып
келесі шарттар келеді:
әрбір шың үшін
D[v]=d(s, v), v
∈
V\T
әрбір шың үшін
D[v]=
s-тен v-ға
апаратын соңғының алдындағы шың V \ Т
жиынтығына
жататын
жолдардың
ең
қысқа
ұзындығына тең.
Шындығында, 5-жолда [u] мәні барлығының ішіндегі t
∈
Т ішіндегі ең
минималдысы болатын u
∈
Т шыңын табамыз. Сонымен бірге, D[u]=d(s,u).
Бұл шындығында солай, себебі, егер s-тен u-ға апаратын ең қысқа
жолдың ұзындығы D[u] кем болса, онда (1) шартының екінші бөлігіне сәйкес
оның соңғысының алдындағы шың Т жиынтығына жататын болады. t -
жолдың Т жиынтығына жататын бірінші шыңы болсын. Біздің s-тен t-ға
апаратын жолдың бастапқы кесіндісін s-тен t-ға апаратын ең қысқа жол
8.11 Контурсыз графтағы жолдар
Орнатылған шыңнан O(n
2
) уақыт ішінде арақашықтықты табу
алгоритмі белгілі болоған екінші жағдайды, нақтырақ айтқанда, граф
контурсыз болған жағдайды қарастырайық.
Контурсыз ерікті графта әрбір доғасы
түрінде, мұнда i
болғанда шыңдарды номерлеуге болады деген лемма бар.
)
,
(
j
i
v
v
Осындай номерлеудің мысалы 33-суретте көрсетілген.
33-сур. Контурсыз графтағы ең ұзын жол
Дәлелдеу үшін осындай номерлеуді іске асыратын алгоритмді
қарастырамыз.
Бастапқы деректер ретінде ТІЗІМ[v] инциденттілік тізімімен берілген
G =
<V, E> графын (бағытталған, контурсыз) графты қолданамыз. Әрбір v
∈
V шыңы үшін алгоритм жұмысының нәтижесі ретінде (u, v)
∈
E доғасы үшін
N[u]
1
BEGIN
2
FOR v
∈
V DO nz[v] := 0; {nz[v] – v-ға кіреті доғалар саны}
3
FOR u
∈
V DO
4
FOR у
∈
ТІЗІМ[u] DO nz[v] := nz[v]+l;
5
СТЕК := 0;
6
FOR v
∈
V
DO
7
IF nz[v] = 0 THEN СТЕК <= v;
8
num := 0;
9
WHILE СТЕК
∅
≠
DO BEGIN
10
u<= CTEK;
11
num := num
+ 1; N[u]
:= num;
12
FOR v
∈
ТІЗІМ [u] DO BEGIN
13
nz[v] :=nz[v]-l;
14
IF nz[v] = 0 THEN СТЕК <= v
15
END
16
END
17
END
Алгоритм келесі фактке негізделеді: ерікті контурсыз графта бірде бір
шың кірмейтін шың бар.