Алгоритм Дейкстры предназначен для нахождения расстояния в графе.
Суть данного алгоритма заключается в том, что выбирается вершина, имеющая минимальное расстояние до заданной стартовой вершины, потом производится ослабление всех исходящих ребер.
Алгоритм:
Суть данного алгоритма заключается в том, что выбирается вершина, имеющая минимальное расстояние до заданной стартовой вершины, потом производится ослабление всех исходящих ребер.
Алгоритм:
- INITIALIZE_SINGLE_SOURCE(G,S)
- S=0
- Q=V[s] //добавляем стартовую вершину в очередь с приоритетом
- While(!Q.empty()) //пока очередь не пуста
- u=Extract_Min(Q) //берем вершину из очереди с минимальным расстоянием
- for v из Adj[u] //для любой смежной вершины v к u
- Relax (u,v,w) //производим релаксацию ребра
Процесс релаксации описан в алгоритме Форда-Беллмана:
Реализация:
void Dijkstra_Shortest_Path(unsigned NumOfVertices, unsigned start){
int M [5][5] = {{0,6,0,7,0}, {0,0,5,8,-4}, {0,-2,0,0,0},{0,0,-3,0,9},{2,0,7,0,0}};
priority_queue< pair< unsigned int,double>, vector< pair > , Prioritize > Q;
int u,v,w;
vector< double> d(NumOfVertices,INFINITY);
d[start] = 0;
Q.push(pair< unsigned int,double >(start,d[start]));
while(!Q.empty())
{
u = Q.top().first;
final.push(u);
Q.pop();
for(int v = 0 ; v < NumOfVertices ; v++)
{
if (M[u][v]) {
w = M[u][v];
cout< d[u] + w)
{
d[v] = d[u] + w;
Q.push(pair(v,d[v]));
}
}
}
}
for(int i=0; i< NumOfVertices; i++)
cout< <"Vertex "< < i< <" cost of vertex: "< < d[i]< < endl;
}
Для того, чтобы добавление в очередь с приоритетом работало, то есть сортировалось в процессе добавления пары, нужно сделать класс-компаратор и перегрузить оператор <
class Prioritize
{
public:
int operator() ( const pair& p1, const pair& p2 )
{
return p1.second < p2.second;
}
};
0 коммент.:
Отправить комментарий