赞
踩
- 求始点 V 1 V_1 V1到其余顶点的最短路径
令不可直接到达
V
1
V_1
V1的点(需经过第三个点)到
V
1
V_1
V1的距离为 ∞ 。
此时,距
V
1
V_1
V1最近的点:
V
1
V_1
V1,最短路径:
V
1
V_1
V1→
V
1
V_1
V1,最短距离:0。
除自身外,距离
V
1
V_1
V1最近的点:
V
4
V_4
V4。可知,最短路径:
V
1
→
V
4
V_1→V_4
V1→V4,最短距离:1。
由上步已获知
V
1
V_1
V1到
V
4
V_4
V4的最短路径,则:
V
1
V_1
V1→
V
4
V_4
V4→
V
3
V_3
V3距离为8 =
V
1
V_1
V1→
V
3
V_3
V3的距离8,不更新表格 ;
V
1
V_1
V1→
V
4
V_4
V4→
V
7
V_7
V7距离为10< ∞,更新表格。
更新表格后,距离
V
1
V_1
V1最近的点:
V
2
V_2
V2。可知,最短路径:
V
1
→
V
2
V_1→V_2
V1→V2,最短距离:2。
邻接矩阵用于描述图上顶点间的关系。例如临接矩阵 D [ i ] [ j ] D[i][j] D[i][j]表示顶点 i 到顶点 j 的直达距离,可将其赋值为无穷大 Inf 来表示顶点 i 无法直达到顶点 j 。
/* 函数名:dijkstra() 迪科斯彻最短路径算法 参数:vs:源点的索引;f:终点的索引; pre[]:前驱数组,即pre[i]为从vs到i最短路径时,i前面那个顶点的索引 dist[]:距离数组,即dist[i]是vs到i的最短路径的长度 全局变量q:点的数量 功能:算出从源点下标vs到其余点最短路径,轨迹记录在pre[],距离记录在dist[]。 */ void dijkstra( int vs, int prev[], int dist[],int f ) { int i,j,k,g; int min; int tmp; int flag[q]; // flag[i]=1表示"顶点vs"到"顶点i"的最短路径已成功获取。 g=0; getweight(); /* 1. 初始化*/ for (i = 0; i < q; i++) { flag[i] = 0; // 顶点i的最短路径还没获取到。 prev[i] = vs; // 顶点i的前驱顶点为0。 dist[i] = martix[vs][i];// 顶点i的最短路径为vs到i的权。 } flag[vs] = 1; // 对顶点vs自身进行初始化 dist[vs] = 0; /* 2. 遍历q-1次,每次找出vs到另一个顶点的最短路径 */ for (i = 1; i < q ; i++) { /* 2.1 在未获取最短路径的顶点中,找到离vs最近的顶点k */ min = INF; for ( j = 0; j < q ; j++) { if (flag[j]==0 && dist[j]<min) //若从vs到顶点j距离小于min,而且从vs到j的最短路径还未获取。 { min = dist[j];//改变最近距离 k = j;//记录j } } /* 2.2 对刚刚已找到最短距离的顶点k进行标记判断 */ flag[k] = 1; // 标记顶点k,dist[k]已确定。 if(k==f) //判断k是否是终点索引,若是则退出 break; /* 2.3 已知顶点k的最短路径后,更新未获取最短路径的顶点的最短路径和前驱顶点 */ for (j = 0; j < q ; j++) { tmp = (martix[k][j]==INF ? INF : (min + martix[k][j])); // 防止溢出 if (flag[j] == 0 && (tmp < dist[j]) ) //若j还不是最短距离且从k到j距离比记录的距离短 { prev[j] = k; //更新k的前驱和最短距离 dist[j] = tmp; } } } }
两个文件在同一文件夹下,运行 tulun1.m 即可。
% 文件命名为:tulun1.m
weight= [0 2 8 1 Inf Inf Inf Inf Inf Inf Inf;
2 0 6 Inf 1 Inf Inf Inf Inf Inf Inf;
8 6 0 7 5 1 2 Inf Inf Inf Inf;
1 Inf 7 0 Inf Inf 9 Inf Inf Inf Inf;
Inf 1 5 Inf 0 3 Inf 2 9 Inf Inf;
Inf Inf 1 Inf 3 0 4 Inf 6 Inf Inf;
Inf Inf 2 9 Inf 4 0 Inf 3 1 Inf;
Inf Inf Inf Inf 2 Inf Inf 0 7 Inf 9;
Inf Inf Inf Inf 9 6 3 7 0 1 2;
Inf Inf Inf Inf Inf Inf 1 Inf 1 0 4;
Inf Inf Inf Inf Inf Inf Inf 9 2 4 0;];
[dis, path]=dijkstra(weight,1, 11)
% 文件命名为:dijkstra.m function [min,path]=dijkstra(w,start,terminal) n=size(w,1); label(start)=0; f(start)=start; for i=1:n if i~=start label(i)=inf; end, end s(1)=start; u=start; while length(s)<n for i=1:n ins=0; for j=1:length(s) if i==s(j) ins=1; end, end if ins==0 v=i; if label(v)>(label(u)+w(u,v)) label(v)=(label(u)+w(u,v)); f(v)=u; end, end, end v1=0; k=inf; for i=1:n ins=0; for j=1:length(s) if i==s(j) ins=1; end, end if ins==0 v=i; if k>label(v) k=label(v); v1=v; end, end, end s(length(s)+1)=v1; u=v1; end min=label(terminal); path(1)=terminal; i=1; while path(i)~=start path(i+1)=f(path(i)); i=i+1 ; end path(i)=start; L=length(path); path=path(L:-1:1);
------------------------------------------------------------------分割线-------------------------------------------------------------------
2020/10/17,翻新总结
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。