Dijkstra算法:设初始节点为v,起始节点到其他节点u的距离为图中v到u的直接线路的距离,如果v和u之间没有直接线路,则d[u]=INF(无穷大)。初始化S={v},寻找最短路径(即在d[]中寻找使d[u]最小的u),将u加入到S中,然后更改到u节点可到达节点的最小距离。再寻找次短路径,并将次短路径的目标节点(设为u)加入到S中,更改到u节点可到达节点的最小距离.如此下去,知道S=V.
一般的Dijkstra算法每次寻找最短路径的时间复杂度O(n),整个算法的时间复杂度为O(n^2).带堆优化的Dijkstra算法每次寻找最短路径时采用堆排序,时间复杂度O(logn)。整个算法的时间复杂度为O(n*logn).
#include<stdio.h>
#include<malloc.h>
#define INF 65535
typedef struct ArcNode{
int dst;
int value;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
int data;
ArcNode * firstedge;
}VNode;
void createAdjList(VNode *&L,int n,int m);
void Dijkstra(int *&d,VNode *&L,int n);
void HeapSort(int *&d,int *&dsti,