图论最短路

dirkstra:

步骤:

每次找到一个点得到这个点到源点的最短距离,再从标记中的点找到距离源点最短距离的点然后在修改它的距离源点的距离值,最后得到所有点到源点的距离。

下面代码示例

​
def dijkstra(graph, start):
    vertices, verticesIndex = [{'index': i, 'weight': None} for i in range(graph.number)], [i for i in range(graph.number)]
    vertices[start - 1]['weight'] = 0
    heapSort(vertices, verticesIndex)
    while len(vertices) > 0:
        swapVertices(vertices, verticesIndex, 0, -1)
        vertex = vertices.pop()
        transformToHeap(vertices, verticesIndex, 0, len(vertices))
        updateDistance(graph, vertices, verticesIndex, vertex)

​

也是一次新的dijkstra算法理解

 

Floyd算法:

用动态规划算法简单粗暴地解决问题dp[i][j][k]  表示从i到j的路径里只能选择1到k的节点的最短路径

状态转移:dp[i][j][k]=min(dp[i][k][k-1]+dp[k][j][k-1] , dp[i][j][k-1])

其中第一个表示经过了节点k  第二个表示不仅过节点k、

因为k是递增的,第三维在数组中一直是k-1出现。所以我们在三重循环下做二维数组就能解决

代码示例如下:

     for(k=1;k<=n;k++)  
     for(i=1;i<=n;i++)  
     for(j=1;j<=n;j++)  
     if(e[i][j]>e[i][k]+e[k][j] )   
        e[i][j]=e[i][k]+e[k][j]; 

SPFA算法:

带负权边的图适用此种算法,可以先判断是否存在负环,若存在则无法计算最短路

首先建立队列列中起始只有源点,在建立一个表格用于记录n个点到源点的最短路径,初始值设为INF,把队列中的点作为源点计算所有点的最短路,计算刷新完毕后将点放入队列最后,一直到队列空

代码示例:

void  spfa(s);  
    for i=1 to n 
 do { dis[i]=INF; vis[i]=false; }   
    dis[s]=0;  
    vis[s]=true; //源点s入队列
    head=0; 
    tail=1; 
    q[tail]=s; 
    while head<tail 
   do {
       head+1;  //队首出队
       v=q[head];  
       vis[v]=false; 
       for 每条边(v,i) 
  	   if (dis[i]>dis[v]+a[v][i])  
	 	dis[i] = dis[v] + a[v][i]  
	   if (vis[i]=false)
       {tail+1; q[tail]=i; vis[i]=true;} //如果不在队列,则加入队列
    } 

简单的复习了一下最小生成树和最短路,还没怎么刷题巩固

 

 

 

 

引用\[1\]提供了使用Python的networkx库绘制网络图和计算最短加权路径的示例代码。该代码使用了一个包含顶点和边的列表,并使用add_nodes_from和add_weighted_edges_from方法将它们添加到图中。然后,使用nx.shortest_path_length方法计算了从顶点v1到顶点v11的最短加权路径长度为13。\[1\] 引用\[2\]提供了一个计算最短路径的Python程序示例。该程序使用了numpy和networkx库。首先,定义了一个包含顶点和边的列表,并使用add_nodes_from和add_weighted_edges_from方法将它们添加到图中。然后,使用nx.shortest_path_length方法计算了最短路径长度,并将结果存储在一个字典中。接下来,使用numpy创建了一个6x6的零矩阵,并使用两个嵌套的for循环将最短路径长度填充到矩阵中。最后,使用矩阵乘法计算了运力,并找到了最小运力和对应的位置。\[2\] 引用\[3\]提供了关于Dijkstra算法的一些背景信息。Dijkstra算法是一种寻找最短路径的算法,适用于所有权重大于等于0的情况。它可以用于解决从一个起始点到任意一个点的最短路径问题。\[3\] 综上所述,如果你想在Python中计算图论中的最短路径,可以使用networkx库和Dijkstra算法。你可以根据引用\[1\]和引用\[2\]中的示例代码进行操作。 #### 引用[.reference_title] - *1* *3* [运筹学——图论与最短距离(Python实现)](https://blog.csdn.net/weixin_46039719/article/details/122521276)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [数学建模:图论模型 — 最短路模型示例 (Python 求解)](https://blog.csdn.net/qq_55851911/article/details/124776487)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值