2. Для всех вершин находим ближайшую вершину BV и строим симметричное замыкание BV: если BV(i)=j и BV(j) ≠ i, то в BV(j) добавляем i. В замыкании будет не более (n-1) неориен.ребра.
3. Поиском сначала вширь по массиву BV выделяем компоненты связности. NKS(j) – номер компоненты связности j-ой вершины, SKS(k) –список вершин k-ой компоненты связности, Q – текущая очередь при поиске k –компоненты, pop(Q) – выбор первой вершины из очереди.
Списки вершин компонент связности на выходе: I: 1,4,5 II: 2,3 III: 6,9 IV: 7,8
Трудоемкость этой части = числу ребер в симметрическом замыкании < 2n.
4. ЧИСТКА. Формируем ребра макрографа в виде списков соседних компонент связности, просматривая по списку SKS вершины очередной КС. Если в списке соседей очередной вершины i встретится вершина j из другой компоненты k с более коротким, чем было записано ранее, ребром между компонентами, то запишем в список соседних макровершин блок k/d (i, j), где d – длина кратчайшего ребра между вершинами компонент.
Список соседей до очистки |
Список соседей после очистки |
||||||||
I |
_ II _ , |
_ IV_ , |
_III_ |
I |
_ II _ , |
_ IV_ , |
_III_ |
||
4(1,2) |
3(4,7) |
4(5,6) |
4(1,2) |
3(4,7) |
4(5,6) |
||||
II |
__I_ , |
_III_ , |
II |
__I_ , |
_III_ |
||||
4(2,1) |
3(3,6) |
4(2,1) |
3(3,6) |
||||||
III |
__II_ , |
__I_, |
_IV_ , |
__IV_ |
III |
__II_ , |
__I_, |
_IV_ |
|
3(6,3) |
4(6,5) |
6(6,8) |
4(6,7) |
3(6,3) |
4(6,5) |
4(6,7) |
|||
IV |
_III_, |
__I__ |
__I__ |
IV |
_III_, |
__I__ |
|||
4(7,6) |
5(7,5) |
3(7,4) |
4(7,6) |
3(7,4) |
Этап 3. Все вершины одной компоненте è STOP.
Трудоемкость алгоритма удовлетворяет неравенству Tn<Cn+Tn/2, Þ линейна по n.
Особенность реализации алгоритма: Заводим и обнуляем вектор прямого доступа из n компонент. Когда в какую-либо ячейку вектора вносится информация, адрес ячейки заносим «в журнал». Для очистки строк таблицы обнуляем поля, адреса которых есть в журнале. При этом очистка не требует большей работы, чем запись. Иначе очистка может потребовать n2 операций.
3.4. КРАТЧАЙШИЕ ПУТИ В ГРАФАХ.
Волновой алгоритм построения ДКП (Дейкстра)
Аналогичен алгоритму Прима (Т=O(n2)), но теперь D(k) – текущее кратчайшее расстояние до вершины, в которой находится аварийная служба, и для которой проводится инициализация. При корректировке сравниваем R=D(k)+d(k,j) и D(j). Если < - то коррекция: D(j)=R. Алгоритм работает корректно, если все d(i,j)≥0.
Рассмотрим работу алгоритма Дейкстры на том же графе:
O |
1 |
1 |
1 |
1 |
4 |
6 5 |
2 3 |
9 |
|
i |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
D |
1 |
3 |
2 |
4 |
7 5 |
7 5 |
9 |
||
W |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.