1046 Shortest Distance (20 分)(贪心算法)

1046 Shortest Distance (20 分)

The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits.

Input Specification:

Each input file contains one test case. For each case, the first line contains an integer N (in [3,105]), followed by N integer distances D​1 D2 ⋯ DN​​ , where D​i is the distance between the i-th and the (i+1)-st exits, and D​N is between the N-th and the 1st exits. All the numbers in a line are separated by a space. The second line gives a positive integer M (≤104), with M lines follow, each contains a pair of exit numbers, provided that the exits are numbered from 1 to N. It is guaranteed that the total round trip distance is no more than 107​ .

Output Specification:

For each test case, print your results in M lines, each contains the shortest distance between the corresponding given pair of exits.

Sample Input:
5 1 2 4 14 9
3
1 3
2 5
4 1
Sample Output:
3
10
7
分析

若采取常规方法,测试点2(starting from 0)会超时,此处采用空间换时间降低时间复杂度 ,具体做法是:在输入的同时计算每个点到第一个点的距离,并将它存放在数组dis中。两点的距离要么环的劣弧,要么是环的优弧,这里先固定一下即求由a到b的距离(a<b),另一端距离用总round trip distance(圆环总长度)减去这里求的距离,比较两者取最小值,特别地,总距离程序中用虚拟的第n+1点表示,因为它到第一个点的距离恰好等于圆环长度。
圆环总长度小于107,那么距离值可以定义为int.

#include<iostream> 
using namespace std;
int dis[100010];
int main(){
	int n,m;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		int tmpdis;
		scanf("%d",&tmpdis);
		if(i==1) dis[i+1]=tmpdis;
		else dis[i+1]=dis[i]+tmpdis;
	}
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		int a,b;
		cin>>a>>b;
		if(a>b) swap(a,b);
		int tmpsum=dis[b]-dis[a];
		cout<<min(tmpsum,dis[n+1]-tmpsum)<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Dijkstra算法来实现最短路径搜索,其Python实现代码如下: def dijkstra(graph,start,end): shortest_distance = {} predecessor = {} unseenNodes = graph infinity = 9999999 path = [] for node in unseenNodes: shortest_distance[node] = infinity shortest_distance[start] = 0 while unseenNodes: min_node = None for node in unseenNodes: if min_node is None: min_node = node elif shortest_distance[node] < shortest_distance[min_node]: min_node = node for child_node, weight in graph[min_node].items(): if weight + shortest_distance[min_node] < shortest_distance[child_node]: shortest_distance[child_node] = weight + shortest_distance[min_node] predecessor[child_node] = min_node unseenNodes.pop(min_node) currentNode = end while currentNode != start: try: path.insert(0,currentNode) currentNode = predecessor[currentNode] except KeyError: print('Path not reachable') break path.insert(0,start) if shortest_distance[end] != infinity: print('Shortest distance is ' + str(shortest_distance[end])) print('And the path is ' + str(path)) return shortest_distance[end], path ### 回答2: 最短路径算法是一种计算两个点之间最短路径的方法。Python语言提供了许多实现最短路径算法的库,其中最常用的是Dijkstra算法和A*算法。 Dijkstra算法是一种贪心算法,用于计算一个节点到其他所有节点的最短路径。在Python中,可以使用networkx库中的dijkstra_path方法来实现。首先,需要创建一个无向图,然后添加节点和边。接下来,使用dijkstra_path方法来计算最短路径。 A*算法是一种启发式搜索算法,用于计算两个节点之间的最短路径。在Python中,可以使用pathfinding库中的astar方法来实现。首先,需要创建一个图,并添加节点和边。然后,使用astar方法来计算最短路径。 以下是一个示例代码,演示如何使用Python中的networkx库实现Dijkstra算法: ```python import networkx as nx def dijkstra_shortest_path(graph, start, end): shortest_path = nx.dijkstra_path(graph, start, end) return shortest_path # 创建一个无向图 graph = nx.Graph() # 添加节点和边 graph.add_edge('A', 'B', weight=4) graph.add_edge('A', 'C', weight=2) graph.add_edge('B', 'C', weight=1) graph.add_edge('B', 'D', weight=5) graph.add_edge('C', 'D', weight=8) graph.add_edge('C', 'E', weight=10) graph.add_edge('D', 'E', weight=2) graph.add_edge('D', 'F', weight=6) graph.add_edge('E', 'F', weight=2) # 计算最短路径 start_node = 'A' end_node = 'F' shortest_path = dijkstra_shortest_path(graph, start_node, end_node) print("最短路径:", shortest_path) ``` 以上是一个使用Python实现Dijkstra算法的示例代码,该代码可以计算无向图中两个节点之间的最短路径。可以根据需要修改节点和边的数量、权重等信息来实现更复杂的最短路径计算。 ### 回答3: 最短路径算法是图论中常用的算法之一,用于在一个带有加权边的图中找到两个节点之间的最短路径。 在Python中,可以使用Dijkstra算法实现最短路径。以下是一个简单的实现: ```python import sys def dijkstra(graph, start, end): # 创建距离字典,保存每个节点到起始节点的最短距离 distance = {node: sys.maxsize for node in graph} distance[start] = 0 # 创建已访问节点集合 visited = set() while True: # 在未访问节点中找到距离起点最短的节点 min_distance = sys.maxsize min_node = None for node in graph: if node not in visited and distance[node] < min_distance: min_distance = distance[node] min_node = node if min_node is None: break # 标记该节点已访问 visited.add(min_node) # 更新与该节点直接相连的节点的最短距离 for neighbor, weight in graph[min_node].items(): new_distance = distance[min_node] + weight if new_distance < distance[neighbor]: distance[neighbor] = new_distance return distance[end] # 测试代码 graph = { 'A': {'B': 2, 'C': 4}, 'B': {'A': 2, 'C': 1, 'D': 3}, 'C': {'A': 4, 'B': 1, 'D': 2}, 'D': {'B': 3, 'C': 2} } start = 'A' end = 'D' shortest_distance = dijkstra(graph, start, end) print(f"The shortest distance from {start} to {end} is {shortest_distance}.") ``` 上述代码实现了Dijkstra算法,并给出了一个简单的图作为测试输入。可以根据需要修改输入的图和起止节点进行测试,并输出最短路径的最短距离。 注意,上述代码中使用了 `sys.maxsize` 作为初始距离值,表示无穷大。这是为了确保从起始节点无法到达的节点距离值始终为无穷大,这样当算法结束时,如果目标节点的距离值仍为无穷大,则说明起始节点无法到达目标节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值