Floyd算法
用Floyd算法求解下图各个顶点的最短距离。
用一个邻接矩阵存储有向图中各个顶点的距离,从1号点开始,假设1号点直接到2号点的初始路径是graph[0][1],1号经过3号点到达2号点的路径就是graph[0][2]+graph[2][1],如果graph[0][2]+graph[2][1]< graph[0][1],则说明1号经过3号点到达2号点的路径更短,故更新邻接矩阵中1号点到2号点的路径,重复更新每个点的路径,最终得到的邻接矩阵就是这个有向图各个顶点的最短路径。
(1)更新经过2号到达各点后的邻接矩阵得:
(2)更新经过3号到达各点后的邻接矩阵得:
(3)更新经过4号到达各点后的邻接矩阵,最终得到各个顶点之间的最短路径的邻接矩阵:
核心代码如下:
//Floyd算法
public static int[][] floyd(int[][] graph) {
for(int k=0;k<graph.length;k++) {
for(int i=0;i<graph.length;i++) {
for(int j=0;j<graph.length;j++) {
if(graph[i][j]>graph[i][k]+graph[k][j]) {
graph[i][j]=graph[i][k]+graph[k][j];
}
}
}
}
return graph;
}
Dijkstra算法
对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。
用一个一维数组dist[]来存储顶点a到各个顶点的初始距离。假设INF为不可达。
(1)、从顶点a开始,在dist[]数组中找出距离最近的点b,将{b}收录进集合中,并更新各点的最短距离。
(2)、从dist[]数组中找出距离最近的一个点d,将{b,c}收录进集合中,并更新各点的最短距离。
(3)、从dist[]数组中找出距离最近的一个点d,将{b,d,c}收录进集合中,并更新各点的最短距离。
(4)、从dist[]数组中找出距离最近的一个点f,将{b,d,c,f}收录进集合中,并更新各点的最短距离。
(5)、从dist[]数组中找出距离最近的一个点e,将{b,d,c,f,e}收录进集合中,并更新各点的最短距离。
(6)、从dist[]数组中找出距离最近的一个点g,将{b,d,c,f,e,g}收录进集合中,并更新各点的最短距离。
(7)、从dist[]数组中找出距离最近的一个点h,将{b,d,c,f,e,g,h}收录进集合中,并更新各点的最短距离,此时得到顶点a到顶点h的最短路径为a-b-d-c-f-e-g-h。
核心代码如下:
//初始化点a的初始路径
for (int i = 1; i < dist.length; i++) {
dist[i]=graph[0][i];
}
visit[0]=1;
for(int i=1;i<dist.length;i++) {
int min=INF,temp=0;
for (int j = 1; j < dist.length; j++) {
//如果该点未访问
if(visit[j]!=1&&dist[j]<min) {
min=dist[j];
temp=j;
}
}
visit[temp]=1;
for (int j = 0; j < dist.length; j++) {
if(graph[temp][j]+dist[temp]<dist[j]) {
dist[j]=graph[temp][j]+dist[temp];
}
}
}
时间复杂度分析
Floyd算法时间复杂度分析
Dijkstra算法时间复杂度分析