1 .问题
用Floyd算法求出下图各顶点的最短距离,用最短距离矩阵表示
用压铸法求出从顶点a到顶点h的最短路径
2 .分析
浮动算法:
将图变换为邻接矩阵(主对角线,也就是从自己到自己的距离为0,设定为不无限大,设定为10000 )。
按编号1、2、3、4的顺序选择的点为中间点m,(以1为例); 如果判断[map[ i ][ 1 ] map[ 1 ][ j ]]map[ i ][ j ]表达式为真,则将map[I][j]的值更新为map[I][1]map[1][j]。
不断更新,最终结果矩阵是任意两点之间的最短距离矩阵。
Dijkstra算法:
Dijkstra是要求单源最短路的算法,也是解决不具有负权的问题的图。 首先,将图转换为邻接矩阵map,定义存储距离的数组distance和存储状态的visited数组。 在从A到B的距离最短的情况下,A通过B到B的点的距离也最短的戴克斯特拉的想法是这样每次找到离A最近的B,将B添加到集合A中,记录从源到B的距离,这是从源到B的最短的短路。 每次判断并更新距离时,所有最后一个顶点中的距离值将变为最短距离,直到包含继续查找b的下一个顶点。
3 .设计
浮动算法:
for (将每个点作为中介点) )。
{
for (扫描矩阵的各点) ) )。
{
for (扫描矩阵的各点) ) )。
{
if )比较矩阵的这一点和连接中点的点之间的距离) ) ) ) ) ) ) ) if ) ) ) if ) ) 652 ) 652 )
{
g.map [ I ] [ j ]=g.map [ I ] [ m ] g.map [ m ] [ j ]; //如果是真的话更新
}
}
}
}
Dijkstra算法:
for(intI=1; i=G.vexs - 1; I )
{
int minn=10000;
int temp=v;
for (寻找最短距离点的遍历) ) ) ) ) ) )。
{
if )如果此点的距离较短且未被访问,则更新最短距离) )。
{
minn=distance[j];
temp=j;
}
}
visited[temp]=1;
for(intI=1; i=G.vexs; I )
{
if (比较该点的总距离和找到的最短距离之间的总距离) ) )。
distance [ I ]=distance [ temp ] g.map [ temp ] [ I ]; //如果是真的话更新
}
}
4 .分析
算法中的三个for环,时间复杂度为o(n^3);
Dijkstra算法的时间复杂度为o(n^2);
5 .源代码
33559 github.com/marvi SSS/- floyed-Dijkstra-/tree/main