单源最短路径 -dijkstra

单源最短路径,dijkstra 算法,邻接阵形式,复杂度O(n^2)
计算正权图的单源最短路(Single Source Shortest Path,源点给定,通过该算法可以求出起点到所有点的最短路),
它是基于这样一个事实:
如果源点到x点的最短路已经求出,并且保存在d[x] ( 可以将它理解为D(s, x) )上,那么可以利用x去更新x能够直接到达的点的最短路。

//单源最短路径,dijkstra 算法,邻接阵形式,复杂度 O(n^2)
//求出源 s 到所有点的最短路经,传入图的顶点数 n,(有向)邻接矩阵 mat
//返回到各点最短距离 min[]和路径 pre[],pre[i]记录 s 到 i 路径上 i 的父结点,pre[s]=-1
//可更改路权类型,但必须非负!
#define MAXN 200
#define inf 1000000000
typedef int elem_t;		//可更改路权类型,但必须非负!
void dijkstra(int n, elem_t mat[][MAXN], int s, elem_t* min, int* pre) {
	int v[MAXN], i, j, k;
	for (i = 0; i < n; i++)
		min[i] = inf, v[i] = 0, pre[i] = -1;
	for (min[s] = 0, j = 0; j < n; j++) {
		for (k = -1, i = 0; i < n; i++)
			if (!v[i] && (k == -1 || min[i] < min[k]))
				k = i;
		for (v[k] = 1, i = 0; i < n; i++)
			if (!v[i] && min[k] + mat[k][i] < min[i])
				min[i] = min[k] + mat[pre[i] = k][i];
	}
}
原文地址:https://www.cnblogs.com/CSE-kun/p/14049379.html