Определение кратчайших растояний



1) Алгоритм Декстера: имеется города и дороги, дороги имеют некоторую длину, найти кратчайший путь между заданными городами. В терминах теории графа более общее задача звучит так: в ориентированной, неориентированной или смешанной сети найти кратчайший путь из заданной вершины во всех остальных.

Данный алгоритм относится к жадным алгоритмам.

Алгоритм:

1) Стартовую вершину заносим в очередь(одномерную таблицу)

2) Начиная с текущей позиции вершины оределяем ближайшуя вершину и все достежимые вершины заносим в очередь.(одномерную таблицу)

3) Найденные ближайшие вершины определяем все достежимые вершины при этом вычисляем растояние от стартовой до найденных вершин. И эти вершины заносим в очередь.

4) Среди неотмеченных ищем минимальное растояние от стартовой вершины.

5) Повторяем пункт 2,4.

Для реализации алгоритма необходимо иметь 3 одномерных массива.

d - таблица растояний, visit - отметка о посещении вершины, way - путь

 

void Init()

{

int i, j;

cin>>n>>m>>start>>finish;

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

if(i==j) A[i][j]=0;

else A[i][j]=Big;

D[i]=Big;

}

for(k=1;k<=m;k++)

{

cin>>i>>j>>d;

A[i][j]=d; A[j][i]=d;

}

}

void Print(int v)

{

if(v>0)

{

Print(way[v]);

cout<<v<<' ';

}

}

 

 

void Dejkstra()

{

int i,j,M;

D[0]=Big+1; D[start]=0;

for(i=1;i<=n;i++)

{

M=0;

for(j=1;j<=n;j++)

if(D[j]<D[M]&&!visit[j]) M=j;

visit[M]=1;

for(j=1;j<=n;j++)

if(D[j]>A[M][j]+D[M])

{

D[j]=A[M][j]+D[M];

way[j]=M;

}

}

}

Количество операций алгоритма Декстера O(n^2).

Алгоритм Флойда

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

c[i][j]

D[i][j][k] наименьшее расстояние между вершинами i*j если в качестве пересадочных разрешено использовать только вершины с номерами k. Тогда D[i][j][0]=c[i][j], D[i][j][k]=min(D[i][j][k], D[i][k+1][k]+D[k+1][j][k]).

Геометрически это озночает (рис 1)

Void Print (int i, int j)

{

if(P[i][j]==0 && i!=j) cout<<' '<<j;

else

{

Print(i, P[i][j]); Print(P[i][j],j);

}

}

Void Floid()

{

int i,j,k,r;

for(i=0;i<=n;i++) for(j=0;j<=n;j++) D[i][j]=A[i][j];

for(k=1;k<=n;k++)

for(i=1;i<=n;i++)

for(j=i+1;j<=n;j++)

{

r=D[i][k]+D[k][j];

if(D[i][j]>r)

{

D[i][j]=r; D[j][i]=r;

P[i][j]=k; P[j][i]=k;

}

}

}

Количество операций O(n^3)

 

21.10.2015


Дата добавления: 2016-01-06; просмотров: 13; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!