Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[192]

так: мы просматриваем все элементы списка L, начиная с начала (строка 5). Всякий раз мы разряжаем текущую вершину и (строка 8). Если при этом высота вершины и увеличилась (что определяется сравнением с сохранённым в строке 7 прежним значением), то мы перемещаем её в начало списка (строка 10). После этого мы переходим к следующему элементу списка L. Заметим, что если мы переместили и в начало списка, то очередным будет элемент, следующий за и в её новой позиции.

Докажем, что алгоритм Lift-To-Front находит максимальный поток. Для этого убедимся, что его можно рассматривать как реализацию общей схемы проталкивания предпотока. Сначала заметим, что программа применяет подъёмы и проталкивания только там, где они возможны (согласно лемме 29.29). Осталось доказать, что после завершения алгоритма никакие подъёмы или проталкивания невозможны, останавливается, возможных подъёмов и проталкиваний нет.

Когда мы в последний раз в программе просмотрели список L, мы разрядили каждую вершину и, не подняв её. Как мы вскоре увидим (лемма 27.30), список L во время выполнения программы остаётся корректно упорядоченным, то есть конец любого допустимого ребра идёт после его начала. Поэтому процедура Discharge(m), проталкивая поток по допустимым рёбрам, создаёт избыток в вершинах, идущих в списке после и, и не трогает вершины, предшествующие и, в которых избыток остаётся равным нулю. Таким образом, по завершинию работы избыток в каждой вершине равен нулю (и ни проталкивание, ни подъём невозможны).

Лемма 27.30

При исполнении алгоритма Lift-To-Front список L остаётся корректно упорядоченным относительно (текущего) графа допустимых рёбер G/th = (V,Efth после любого числа итераций цикла в строках 6-11.

Доказательство

Перед первым выполнением цикла допустимых рёбер нет, так как высота истока h[s] равна \V\ 2 (множество V содержит по крайней мере исток s и сток t), а высота остальных вершина равна 0 (и единичного перепада высот быть не может).

Докажем, что свойство топологической упорядоченности сохраняется после каждого выполнения тела цикла. Сеть допустимых рёбер меняют только подъёмы и проталкивания. По лемме 27.27, проталкивания не создают допустимых рёбер. После подъёма произвольной вершины и все рёбра, входящие в эту вершину - недопустимые (лемма 27.28). Поэтому после перемещения и в начало списка порядок элементов в списке становится корректным.

Анализ алгоритма

Покажем, что время работы алгоритма «поднять-и-в-начало» на сети G = (V, Е) равно 0(V3). Сначала напомним некоторые уже


27.11 Работа алгоритма Lift-To-Front, (а) Начальный поток перед первым выполнением цикла. Из истока s выходит 26 единиц. Справа изображён список L (серым показано текущее значение и). Под каждой вершиной выписан список её соседей (серым выделен сосед current[u]). Сначала мы разряжаем вершину ж. Она поднимается на высоту 1. Из 12 единиц избытка отправляем 5 в вершину у, а затем оставшиеся 7 в сток t. Высота вершины х увеличилась, так что х помещаем в начало списка L (впрочем, она там и была). (Ь) На следующем шаге разряжаем вершину у, следующую за х. (На рис. 27.10 этот процесс показан подробно.) Высота вершины у увеличилась, и мы перемещаем её в начало списка L. (с) Теперь в списке за у следует х и мы разряжаем вершину ж, протолкнув 5 единиц потока в сток t. Подъёма не происходит, так что список L не меняется, (d) Следующую за ж в списке вершину z мы разряжаем, поднимая её до высоты 1 и проталкивая 8 единиц в сток t. Поскольку вершина поднята, она перемещается в начало списка L. (е) Переполненных вершин больше нет, поэтому процедура Discharge, последовательно применённая к вершинам у и ж, ничего не меняет. Программа LlFT-to-front достигает конца списка L и останавливается. Максимальный поток найден.

известные нам факты. Этот алгоритм является реализацией метода проталкивания предпотока, поэтому действует верхняя оценка О (V) на число подъёмов каждой вершины (следствие 27.21), а общее число подъёмов есть 0(V2). В соответствии с упр. 27.4-2, на все подъёмы уходит время 0(VE). Общее число насыщающих проталкиваний есть 0(VE) (лемма 27.22). Теорема 27.31

Время работы программы Lift-To-Front на сети G = (V, Е) равно 0(V3). Доказательство

Разобьём время работы программы Lift-To-Front на периоды между двумя подъёмами. Тогда всего периодов будет (как и подъёмов) 0(V2). Покажем, что за каждый период мы вызываем процедуру Discharge 0(V) раз. Действительно, за один период число вызовов процедуры Discharge (поскольку внутри периода мы не поднимаем вершину, список остаётся неизменным) не превосходит длины списка, и тем самым \V\.

Следовательно, процедура Discharge вызывается 0(V3) раз (строка 8), и время работы программы Lift-To-Front равно 0(V3) плюс суммарное время, уходящее на выполнение вызовов Discharge. Оценим второе слагаемое.

При каждом повторении цикла в процедуре Discharge совершается ровно одно из трёх действий: подъём вершины, перемещение указателя и проталкивание предпотока. Оценим количество one-


рации каждого из этих типов.

Начнём с подъёмов (строки 4-5). На все 0(V2) подъёмов требуется время 0(VE) (упр. 27.4-2).

Оценим количество перемещений указателя current[u] (строка 8). Обозначим через degree (и) степень вершины и. На каждый подъём вершины и приходятся 0(degree(u)) перемещений указателя, поэтому всего производится 0(V degree(u)) перемещений для каждой вершины. Таким образом, общее число перемещений указателей равно 0(VE) (по лемме о рукопожатиях, упр. 5.4-1).

Оценим число проталкиваний (строка 7). Мы уже знаем, что количество насыщающих проталкиваний равно 0(VE). Заметим, что сразу после выполнения ненасыщающего проталкивания процедура Discharge прекращает работу, так как избыток потока обращается в ноль. Таким образом, при каждом вызове процедуры выполняется не более одного ненасыщающего проталкивания; всего вызовов 0(V3), поэтому ненасыщающих проталкиваний не более 0(V3).

Таким образом, время работы программы Lift-To-Front есть 0(V3 + VE) = 0(V3). Упражнения 27.5-1

Следуя образцу рис. 27.11, покажите работу программы Lift-To-Front на сети рис.27.1 (а). Считать, что изначально список L имеет вид (1,2,3,4)1 а списки соседей таковы:

N[Vl] = (S) V2, V3) NiV2] = (S, Vi, V3, V4)

N[v3] = {vl,v2,v4,t) N[v4] = (v2,v3,t).

27.5-2*

Рассмотрим реализацию алгоритма проталкивания предпотока, при которой все переполненные вершины хранятся в виде очереди. Алгоритм разряжает первую вершину из очереди и удаляет её, а если в результате этого появились новые переполненные вершины, они добавляются в конец очереди. Алгоритм останавливается, когда очередь пуста. Покажите, что время работы этого алгоритма равно 0(V3).

27.5-3

Заменим в процедуре Lift строку 3 строкой: h[u] <- h[u] + 1. Покажите, что общий алгоритм проталкивания предпотока останется корректным. Как это изменение скажется на работе программы Lift-To-Front?

27.5-4*

Покажите, что алгоритм, построенный по методу проталкивания предпотока, разрешающий вершину самой большой высоты работает время 0(V3).



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]