АкушерствоАнатомияАнестезиологияВакцинопрофилактикаВалеологияВетеринарияГигиенаЗаболеванияИммунологияКардиологияНеврологияНефрологияОнкологияОториноларингологияОфтальмологияПаразитологияПедиатрияПервая помощьПсихиатрияПульмонологияРеанимацияРевматологияСтоматологияТерапияТоксикологияТравматологияУрологияФармакологияФармацевтикаФизиотерапияФтизиатрияХирургияЭндокринологияЭпидемиология

Задачи о кратчайших маршрутах

Прочитайте:
  1. I. Решите задачи.
  2. I. ЦЕЛЬ И ЗАДАЧИ ДИСЦИПЛИНЫ «МЕЖДУНАРОДНЫЙ МЕНЕДЖМЕНТ»
  3. II. Задачи (кейсы для подготовки – Aslakhanova, Janowiec, von Hannover, Al-Skeini, Finogenov – см. ниже)
  4. II. Задачи по частной патологической анатомии
  5. II. Задачи по частной патологической анатомии
  6. V. Выполнить ситуационные задачи.
  7. VI. Дальнейшие задачи и направления работы
  8. А. Ситуационные клинические задачи
  9. Б.Тестовые задачи
  10. В. Задачи для самоконтроля с ответами.

 

Пусть дан граф g = (V,X) и две его вершины a, bÎV. Имеется 4 вида задач о кратчайших маршрутах.

1° Найти длину кратчайшего маршрута из вершины a в вершину b.

2° Найти маршрут минимальной длины из a в b.

3° Найти количество кратчайших маршрутов из a в b.

4° Найти множество всех кратчайших маршрутов из a в b.

Под длиной маршрута в графе понимают количество ребер, его составляющих.

Алгоритмы решения указанных задач могут быть построены на основе волновых процессов.

Задача о кратчайших маршрутах относятся к классу P.

 

Задача 1°

Будем выполнять волновой процесс 1 начиная с V0 = {a}. Завершим его в том случае, если очередное подмножество Vk будет включать вершину b. Индекс k этого подмножества и будет искомой длиной кратчайшего пути.

Ниже, в качестве примера программной реализации такого алгоритма, приведена функция dist(g,i,m) из библиотеки ALGRAPH/C++ (в несколько упрощенном варианте), которая находит длину кратчайшего маршрута из вершины i в вершину m. Если маршрут для указанных вершин отсутствует, функция возвращает значение -1.

 

int dist(graf g, int i, int m)

{ int a,b,j,k,Nvv,Nw, L=0, n=g.nv;

if (i==m) return 0;

if (g.p[i]==0) return -1;

byte* Vs= new byte[n];

int *vv= new int[n],

*w = new int[n];

for (k=0;k<n;k++) Vs[k]=0;

Vs[i]=1; vv[0]=i; Nvv=1;

while (Nvv)

{ Nw=0; L++;

for (j=0;j<Nvv;j++)

{ a=vv[j];

for (k=0;k<g.p[a];k++)

{ b=g.r[a][k]; if (b==m) goto mm;

if (Vs[b]==0) { Vs[b]=1; w[Nw++]=b; }

}

}

for (j=0;j<Nw;j++) vv[j]=w[j];

Nvv=Nw;

}

L=-1;

mm:

delete[] Vs; delete[] vv; delete[] w;

return L;

}

 

Задача 2°

Алгоритм поиска кратчайшего пути следует из свойств 2,3 волнового процесса 2.

 

Задача 3°

Выполним волновой процесс 2. В результате получим последовательность подмножеств вершин V'0, V'1,..., V'k, при этом V'0 = {a}, V'k = {b}. Пронумеруем вершины в каждом из подмножеств независимо. Каждой вершине из указанных подмножеств припишем два индекса так, чтобы запись vij обозначала вершину номер j из подмножества V'i. Очевидно, что v0,1 = a, vk,1 = b. Обозначим через j(vij) вес вершины vij. Каждой вершине из подмножеств V'0, V'1,..., V'k присвоим вес в соответствии со следующим правилом.

1. Положим j(v0,1) = 1.

2. , i = 0, 1,..., k-1.

Суммирование необходимо выполнять по всем значениям m, удовлетворяющих условию:

<vi,m, vi+1, j> Î X.

Пункт 2 означает, что вес вершины vi+1, j определяется как сумма индексов всех тех вершин из множества V'i, которые являются начальными по отношению к вершине vi+1, j.

При выполнении п.2 следует соблюдать очередность: вначале определяются веса всех вершин из множества V'i, затем веса всех вершин из следующего за ним множества V'i+1.

После завершения процедуры вес конечной вершины j(vk,1) = j(b) будет равен искомому количеству кратчайших путей.

 

Задача 4°

Алгоритм решения этой задачи вытекает из свойства 3 волнового процесса 2.

 


Дата добавления: 2015-09-27 | Просмотры: 484 | Нарушение авторских прав







При использовании материала ссылка на сайт medlec.org обязательна! (0.002 сек.)