多源最短路径 -稠密图 -floyd_warshall

针对稠密图的 Floyd-Warshall 算法
Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Problem)
允许存在权值为负的边

  1. 多源最短路径,floyd_warshall 算法,复杂度 O(n^3)
  2. 求出所有点对之间的最短路径,传入图的大小和邻接阵 n * n
  3. 返回各点间最短距离 min[]和路径 pre[],pre[i][j]记录 i 到 j 最短路径上 j 的父结点
//多源最短路径,floyd_warshall 算法,复杂度 O(n^3)
//求出所有点对之间的最短路径,传入图的大小和邻接阵 mat
//返回各点间最短距离 min[]和路径 pre[],pre[i][j]记录 i 到 j 最短路径上 j 的父结点
//可更改路权类型,路权可以为负
#define MAXN 200
#define inf 1000000000
typedef int elem_t;		//可更改路权类型,路权可以为负
void floyd_warshall(int n, elem_t mat[][MAXN], elem_t min[][MAXN], int pre[][MAXN]) {
	int i, j, k;
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			min[i][j] = mat[i][j], pre[i][j] = (i == j) ? -1 : i;
	for (k = 0; k < n; k++)
		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
				if (min[i][k] + min[k][j] < min[i][j])
					min[i][j] = min[i][k] + min[k][j], pre[i][j] = pre[k][j];
}

固定中间节点,首尾遍历,更新
没什么技巧,暴力跑

原文地址:https://www.cnblogs.com/CSE-kun/p/14048965.html