Задачи о кратчайших маршрутах
Пусть дан граф 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 | Просмотры: 482 | Нарушение авторских прав
|