Dijkstra算法
对于Dijkstra算法可以看天勤数据结构高分笔记206页,有对该算法非常详细的解释
/**
* Dijkstra算法,求一点到其他各顶点的最短路径
*
* @param G 用邻接矩阵表示的图
* @param v 开始顶点
* @param dist 表示当前已找到的从v0到每个终点vi的最短路径长度。初态为:若v0到vi右边,则为其权值,否则为INF...不可达
* @param path 保存从v0到vi最短路径上vi的前一个路径,初态:若v0到vi有边为v0,否则为-1‘
*
* 在函数结束之后dist数组中存储的是初始顶点v到其他个顶点的最短路径长度,path中存放的是v到其余顶点的最短路径
*
*/
void Dijkstra(MGraph G,VertexType v,int dist[],int path[]){
int set[G.vexnum]; //设置标志数组
int min;
//对dist,path,set数组进行初始化
for (int i = 0; i < G.vexnum; ++i) {
//dist中存储的是顶点v到其他个顶点的距离,那么在邻接矩阵表示图中就是[v,i]对应的数据
dist[i] = G.arcs[v][i].adj;
set[i] = 0; //表示当前的顶点都没有加入到集合中
if (G.arcs[v][i].adj < INFINITY){//INFINTY表示带权值的图中不可达的无穷
path[i] = v; //让path存储的是当前顶点vi的上一个顶点v
} else{
path[i] = -1; //-1表示不与顶点v相连,所以就没有路径,不可达
}
}
set[v] = 1; //当前顶点v已经加入到了集合S中
path[v] = -1; //最开始的顶点是没有前一个顶点的,所以置为-1
dist[v] = 0;
//关键操作开始
//对剩余n-1各顶点进行遍历
int tump;
for (int i = 0; i < G.vexnum-1; ++i) {
min = INFINITY;
//在遍历dist中所有元素,在剩余顶点中寻找到达的距离最小的顶点
for (int j = 0; j < G.vexnum; ++j) {
if (set[j] == 0 && dist[j]<min){
tump = j;
min = dist[j];
}
}
set[tump] = 1; //将tump表示的顶点加入到集合中,表示将其加入最短路径
//以刚并入的顶点作为中间点,对所有通往剩余顶点的路径进行检测,如果更短就跟新
for (int j = 0; j < G.vexnum; ++j) {
//判断tump所代表的顶点加入后是否会出现通往顶点j的更短的路径,如果出现则跟新,改变原来的路径会如长度
if (set[j]==0 && dist[tump]+G.arcs[tump][j].adj < dist[j]){
dist[j] = dist[tump]+G.arcs[tump][j].adj;
path[j] = tump;
}
}
}
}