Part I:Floyd

(1):先讲Floyd这是最短路算法里​​O(n^3)​​的算法,也是最容易理解的

(2):先定义一个邻接矩阵​​int s[5][5]​​​ 共有两个下标 这里定义​​i,j​​ 定义无穷​=inf​​ map:

最短路(Dijkstra,   Floyd)_数据

(3):数据输入:

map:

最短路(Dijkstra,   Floyd)_最短路径_02

由这个图可以知道​​s[1][2]=1 s[1][3]=5 s[2][3]=2 s[2][4]=6 s[3][4]=7 s[3][5]=1 s[4][3]=2 s[4][5]=4​

(4)Floyd的算法思想:采用了贪心思想这里我们讲解一下:
:求​​1--->3的距离​​​ ​​s[1][2]=1 s[1][3]=5 s[2][3]=2​​​ 由这组数据我们可以知道​​1--->3​​由两种方式​​1--->2--->3​​and​​1--->3​​我们只要比较这两种方式的距离即可知道谁​​1--->3​​最小的距离
疑点:但有人可能会问,但数据不是呢么凑巧中间间隔不一定是​​1​​怎么办,Floyd用了​​O(n^3)​​的算法,他会枚举每一种情况
:求​​1--->5​​的最短距离首先我们要比较​​1--->2和2--->5​​与​​1--->5​​的距离然后一直枚举这样会将​​1--->5​​之间的最短路径枚举出来与​​1--->5​​作比较,最终得出结果

代码:

for(int i=1;i<=n;i++)
{
for(int k=1;k<=n;k++)
{
for(int j=1;j<=n;j++)
{
if(s[i][k]<inf&&s[k][j]<inf&&s[i][j]>(s[i][k]+s[k][j]))
s[i][j]=s[i][k]+s[k][j];
}
}
}

Part I I:Dijkstra
(1)Dijkstra这个算法相比与Floyd这个算法,更快,将​​​O(n^3)​​​的复杂度将为​​O(n^2)​​​,并没有Floyd呢么暴力,但依旧暴力
(2)首先进行初始操作,建一个邻接矩阵 ​​​int[5][5]​​​,首先将每一个位置都赋值为inf.输入数据
(3)Dijkstra是单源最短路,是为求一个已知点到其他各点的最短距离接下来我们根据代码进行了解:

void Dijkstra(int u)//单源最短路
{
for(int k=1;k<n;k++)
{
int minv=0x3f3f3f,mini;
for(int i=1;i<n;i++)
{
if(!flag[i]&&way[u][i]<minv)
{
mini=i;//找到u--->i的最短距离
minv=way[u][i];
}
}
flag[mini]=1;
for(int j=1;j<n;j++)
{
if(!flag[j]&&way[mini][j]<0x3f3f3f)
{
way[u][j]=min(way[u][j],way[u][mini]+way[mini][j]);
}
}

}
}

首先我们先找到​​u--->i​​​的最短路径,然后记录下来,然后找​​i--->j​​​的最短路径然后记录下来之后就可以找到​​u--->j​​的最短路径,flag的作用是为了避免重复使用中间值,因为是单源最短路这里flag可以标记掉