一、Floyd算法——只有五行代码的算法
算法思想:
从节点i到节点j的最短路径只有2种可能:
1)直接从节点i到节点j
2)从节点i经过若干个节点k到节点j
假设dis(i,j)为节点i到节点j的最短路径的距离
对于每一个节点k,我们检查dis(i,k)+dis(k,j) < dis(i,j)是否成立,
如果成立,证明从i到k再到j的路径比i直接到j的路径短.
于是dis(i,j) = dis(i,k) + dis(k,j),这样一来,当我们遍历完所有k,dis(i,j)中记录的便是节点i到节点j的最短路径的距离
缺点:时间复杂度太高 O(n^3)
模板:
void Floyd()
{
for(int k = 1; k <= N; k++)
for(int i = 1; i <= N; i++)
for(int j = 1; j < N; j++)
if(dis[i][k] + dis[k][j] < dis[i][j])
dis[i][j] = dis[i][k] + dis[k][j];
}
二、Dijkstra算法
如下图: