关于狄克斯特拉算法(dijkstra)总结

本文详细介绍了狄克斯特拉算法的基本原理及实现步骤,并通过具体实例解释了如何使用该算法来寻找图中两点间最短路径的过程。文章还提供了一个C语言实现的算法模板。
关于狄克斯特拉算法(dijkstra)总结
1,2,4是四个定点其他的是距离,从2到4最直接的就是2-4,但是不是最近的,需要舒展一下2-1-4,这样只有8.所以才是最短的。这个过程就是狄克斯特拉算法。下面进入正题:
 
关于狄克斯特拉算法(dijkstra)总结

我们这里定义图的编号为:

1 2 3

4 5 6

7 8 9

图1:初始化的图,其中包含边的权值(耗时)。(这里图是有向图)。

图2:确定起点,然后向能直接走到的点走一下,记录此时的估计值:2 6 9.。

图3:找到距离起点最近的点,是正东边的那个点,这时候我们耗费权值为2。然后我们进行松弛操作,从起点到其东南方的点直接到的权值耗费为6,但是我们通过刚刚选定的点,我们找到了到这个点更近的方式,所以这个时候我们说从起点到其东南方向的点的权值更新值从6变成了5。这个时候我们就完成了第一次松弛操作。

图4:依旧是找距离起点最近的点。然后松弛我们发现这个时候从起点到其东南方的点的耗费权值从5又变成了4.这个时候我们完成了第二个松弛。

之后的方式同上:选定距离起点最近的点v。然后通过点v进行松弛操作。我们发现能够通过增加走到目的地方式的复杂度(多转弯)的方式我们能够松弛掉权值,使得耗费的权值更小。
     模板:

void Dij()//我们这里起点为1号编码点。我们这里的d[]表示从起点到这个点需要的权值。w[a][b]表示点a到点b这条边的权值.
{
 int i,j,k,v,tmp;
 memset(vis,0,sizeof(vis));
 for(i=1;i<=n;i++)
     d[i]=w[1][i];//对应图不难理解,对于起点的初始化
 d[1]=0;
 vis[1]=1;
 for(i=1;i<=n;i++)//控制连接点的次数,例如上图,九个点,就循环九次。
 {
  tmp=N;//这里N表示无穷大。也就是图上的99.
  for(j=1;j<=n;j++)
  {
   if(tmp>d[j]&&!vis[j])
   {
    tmp=d[j];
    v=j;
   }
  }//每次我们都找到距离起点最近的点v
  vis[v]=1;
  for(k=1;k<=n;k++)//然后进行松弛操作。

我们这里的d[]表示从起点到这个点需要的权值//加以强调其含义。
{
    if(!vis[k])
   d[k]=min(d[k],d[v]+w[v][k]);
}
}
}
参考博客:http://blog.youkuaiyun.com/mengxiang000000/article/details/50421243
 

 

转载于:https://www.cnblogs.com/wuwangchuxin0924/p/5781525.html

狄克斯特拉Dijkstra算法用于计算单源最短路径,即从一个点出发到图中其他各点的最短路径。以下是不使用外部包实现狄克斯特拉算法的 Python 代码: ```python import sys def dijkstra(graph, start): num_vertices = len(graph) # 初始化距离数组,用于存储从起始点到各个顶点的最短距离 distances = [sys.maxsize] * num_vertices # 起始点到自身的距离为 0 distances[start] = 0 # 记录顶点是否已经被访问过 visited = [False] * num_vertices for _ in range(num_vertices): # 找到未访问顶点中距离最小的顶点 min_distance = sys.maxsize min_vertex = -1 for v in range(num_vertices): if not visited[v] and distances[v] < min_distance: min_distance = distances[v] min_vertex = v # 标记该顶点为已访问 visited[min_vertex] = True # 更新与该顶点相邻的顶点的距离 for neighbor in range(num_vertices): if not visited[neighbor] and graph[min_vertex][neighbor] > 0 and \ distances[min_vertex] + graph[min_vertex][neighbor] < distances[neighbor]: distances[neighbor] = distances[min_vertex] + graph[min_vertex][neighbor] return distances # 示例图的邻接矩阵 graph = [ [0, 2, 5, 1, float('inf'), float('inf')], [2, 0, 3, 2, float('inf'), float('inf')], [5, 3, 0, 3, 1, 5], [1, 2, 3, 0, 1, float('inf')], [float('inf'), float('inf'), 1, 1, 0, 2], [float('inf'), float('inf'), 5, float('inf'), 2, 0] ] start_vertex = 0 shortest_distances = dijkstra(graph, start_vertex) print(f"从顶点 {start_vertex} 到其他各顶点的最短距离: {shortest_distances}") ``` ### 代码解释 1. **初始化**:`distances` 数组用于存储从起始点到各个顶点的最短距离,初始值设为无穷大,起始点到自身的距离为 0。`visited` 数组用于标记顶点是否已经被访问过,初始值都为 `False`。 2. **寻找最小距离顶点**:在未访问的顶点中找到距离最小的顶点。 3. **标记顶点为已访问**:将找到的最小距离顶点标记为已访问。 4. **更新相邻顶点的距离**:对于与该顶点相邻的未访问顶点,如果通过该顶点到达相邻顶点的距离比当前记录的距离小,则更新距离。 5. **返回结果**:返回存储最短距离的数组。 ### 复杂度分析 - **时间复杂度**:$O(V^2)$,其中 $V$ 是图中顶点的数量。因为在每次迭代中,都需要遍历所有顶点来找到最小距离的顶点。 - **空间复杂度**:$O(V)$,主要用于存储 `distances` 和 `visited` 数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值