1. 本文主要集中使用最小堆数据结构实现Dijkstra算法。
首先, 将前文IsInS结构拆分为vector<int> S, vector<int>Q, 方便最小堆的实现,S也是可以删除的,修改后的代码如下
#include <iostream>
#include <iostream>
#include <vector>
#include <stack>
#include<algorithm>
#include "bheap.hpp"
using namespace std;
int map[][6] = { //定义无向图,或者有向图
{0, 6, 3, INT_MAX, INT_MAX, INT_MAX},
{6, 0, 2, 5,INT_MAX, INT_MAX},
{3, 2, 0, 3,4, INT_MAX},
{INT_MAX,5, 3, 0, 2, 3},
{INT_MAX,INT_MAX, 4, 2, 0, 5},
{INT_MAX,INT_MAX,INT_MAX,3,5,0}
};
void init(int num, int startVertex,int distance[], int prevVertex[], vector<int>& Q)
{
/*初始化distance和prevVertex数组*/
for(int i =0; i < num; ++i)
{
distance[ i ] = map[ startVertex ][ i ]; //源节点到各个节点的距离,其中INT_MAX代表不可达
if(map[ startVertex ][ i ] < INT_MAX) //如果是可达的
prevVertex[ i ] = startVertex;
else
prevVertex[ i ] = -1; //表示还不知道前一个节点是什么
}
prevVertex[ startVertex ] = -1; //源节点无前一个节点
for(int i =0; i < num; ++i)
{
if(i != startVertex)
{
Q.push_back(i);
}
}
}
void extractMin(vector<int>& Q,int distance[],int& currentVertex)
{
/*在Q中选择u到j的distance最小的一个节点, 如第一步A到C,最后目标到D*/
int minDistance = INT_MAX;
vector<int>::iterator ite = Q.begin();
for(; ite!=Q.end();ite++) //
{
if((distance[*ite] < minDistance))//寻找初始currentVertexA到Q中distance最小的节点 最后为新的currentVertexC
{
currentVertex = *ite;
minDistance = distance[*ite];
}
}
return;
}
/*对这个新的currentVertexC做松弛计算,更新distance*/
void Relax(vector<int> Q,int distance[],int pre[],int& currentVertex)
{
vector<int>::iterator ite = Q.begin();
for(; ite!=Q.end();ite++)
{
if (map[currentVertex][*ite] < INT_MAX) //在Q中,有距离的为c->d,c->e, c->b
{
int currentdist = distance[ currentVertex] + map[ currentVertex ][*ite];