求图的最短路径,有两个经典的算法——dijkstra和floyd算法。
dijkstra算法适合稀疏图(邻接链表)求单点到其他点的最短路径。floyd算法适合稠密图(邻接矩阵)求各点到其他点的最短路径。邻接矩阵是图的一种简单的表示形式。dijkstra算法虽然适合邻接链表,算法题中也常用邻接矩阵实现。
宏定义点个数100,使用typedef定义边权重的类型int,方便程序的调试,同时用int(-1)表示两点间不存在边。
#define MAX_V 100
typedef int var;
const var NO_PATH = -1;
var map[MAX_V][MAX_V];
1.Dijkstra算法
dijkstra采用了贪婪技术,该算法有效的前提是图中没有负数权重的边。
一开始,被选择的点只有源点,每次选择离源点最近的一个未被选择的点,从这个点更新其余未被选择的点的最短距离。
/*dijkstra选择的路径和最短距离*/
int path_d[MAX_V][MAX_V];
var dist_d[MAX_V][MAX_V];
bool visited[MAX_V][MAX_V];
void dijkstra(int n,int s) {
int *p = path_d[s];
var *d = dist_d[s];
bool *v = visited[s];
for (int i = 0; i < n; i++) {
d[i] = NO_PATH;
p[i] = i;
}
d[s] = 0;
while (1) {
int j = -1;