3069. 网红重庆1最短路径问题SPFA queue 链表

  1. 网红重庆1
    【问题描述】

网红城市——重庆,堪称一座8D的魔幻大都市,明明(不要问我明明是谁?)在一楼上的电梯,到了11楼出电梯又是一楼。

假设重庆有N个地点,给出各个地点的海拔高度,各个地点之间可能有双向的路径连接,或者单向的路径连接。有一个外地人来重庆,要从地点C到D,但他对爬坡下坎很不习惯,请帮他在从C到D所有路径中,找一条海拔变化(海拔降低或升高都视为正的值)最小的路径,即组成路径的各条直接路径海拔变化的总和最小。

【输入形式】

输入文件包含多个测试数据。每个测试数据第1行是两个整数N和M,N表示地点的数目,5≤N≤50,地点的序号从1开始计起,M表示这N个地点之间直接路径的数目,对任意两个地点A、B,A和B之间有一条双向直接路径、从A到B有一条单向直接路径、从B到A有一条单向直接路径,这3种情形最多只出现一种情形,测试数据保证这N个地点之间是互相可达的(再啷个爬坡下坎,总还是走得到的);第2行有N个整数,表示这N个地点的海拔高度,范围在[100, 1000],可能存在相同海拔高度的地点;接下来有M行,描述了M条直接路径,格式为“1 A B”或“2 A B”,前者表示从地点A到地点B的一条单向直接路径,后者表示地点A和B之间的一条双向直接路径,A和B为地点的序号,A≠B;每个测试数据的最后一行为两个整数C和D,表示那个外地人要从地点C到D,C和D为地点的序号,C≠D。测试数据保证地点序号都是有效的。

输入文件最后一行为0 0,代表输入结束。

【输出形式】

对每个测试数据,输出占一行,为求得的从地点C到D的各条路径中海拔变化总和的最小值。

【样例输入】

5 5

100 160 230 450 120

2 1 2

1 1 5

2 2 5

2 3 4

2 4 5

1 3

0 0

【样例输出】

570

#include<bits/stdc++.h>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 100
struct node
{
   
	int t;
	int w;
	node*next;
};
queue<int>q;
int n,N;
node*List[MAXN];
int inq[MAXN];
int d[MAXN];
int p[MAXN];
int a[MAXN];//海拔高度 
void spfa(int src)
{
   
	int i,u;//u为队列头顶点序号
	node*t;
	for(i=1;i<=N;i++)
	<
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,解决最路径问题的一种常见算法是Dijkstra算法。Dijkstra算法可以用于求解带权重的有向图或无向图中的最路径。 以下是一个使用Dijkstra算法求解最路径的示例代码: ```python import heapq def dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances[start] = 0 queue = [(0, start)] while queue: current_distance, current_node = heapq.heappop(queue) if current_distance > distances[current_node]: continue for neighbor, weight in graph[current_node].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(queue, (distance, neighbor)) return distances # 示例图的邻接字典 graph = { 'A': {'B': 5, 'C': 2}, 'B': {'A': 5, 'C': 1, 'D': 3}, 'C': {'A': 2, 'B': 1, 'D': 1}, 'D': {'B': 3, 'C': 1, 'E': 4}, 'E': {'D': 4} } start_node = 'A' distances = dijkstra(graph, start_node) print(f"The shortest distances from node {start_node}:") for node, distance in distances.items(): print(f"To node {node}: {distance}") ``` 在上述示例中,我们定义了一个`dijkstra`函数来实现Dijkstra算法。通过传入一个邻接字典表示的图和起始节点,我们可以得到从起始节点到其他节点的最距离。这里使用了优先队列(堆)来实现最小堆的效果。 示例中的图是一个带权重的无向图,通过邻接字典的形式表示。然后,我们将起始节点设为'A',并调用`dijkstra`函数来计算最路径。最后,打印出从起始节点到其他节点的最距离。 需要注意的是,如果图中存在负权边,则需要使用其他算法,如Bellman-Ford算法或SPFA算法来解决最路径问题。以上代码仅适用于没有负权边的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值