Part I:Floyd
(1):先讲Floyd这是最短路算法里O(n^3)
的算法,也是最容易理解的
(2):先定义一个邻接矩阵int s[5][5]
共有两个下标 这里定义i,j
定义无穷=inf
map:
(3):数据输入:
map:
由这个图可以知道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
and1--->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可以标记掉