本文共 1810 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找到探险家用最少金币娶到酋长的女儿的方法。酋长的女儿的物品编号为2,而探险家的编号为1。我们需要计算从节点1到节点2的最短路径,考虑地位差距和替代品的优惠价格。
import heapqdef main(): import sys input = sys.stdin.read().split() idx = 0 M = int(input[idx]); idx +=1 N = int(input[idx]); idx +=1 INF = float('inf') a = [INF] * (N + 1) level = [0] * (N + 1) for i in range(2, N+1): P = int(input[idx]); idx +=1 L = int(input[idx]); idx +=1 X = int(input[idx]); idx +=1 a[i] = P level[i] = L for _ in range(X): T = int(input[idx]); idx +=1 V = int(input[idx]); idx +=1 j = T + 1 # 替代品是物品编号 if a[j] > a[i] + V: a[j] = a[i] + V # Dijkstra算法 # 节点1到节点2的最短路径 heap = [] dist = [INF] * (N + 1) dist[1] = 0 heapq.heappush(heap, (0, 1)) while heap: current_dist, u = heapq.heappop(heap) if u == 2: break if current_dist > dist[u]: continue for v in range(1, N+1): if v == u: continue if level[u] - level[v] > M or level[v] - level[u] > M: continue new_dist = current_dist + a[u] # 这里可能有问题,需重新审视 if new_dist < dist[v]: dist[v] = new_dist heapq.heappush(heap, (new_dist, v)) print(dist[2])if __name__ == "__main__": main() 通过这种方法,我们可以高效地找到最小的金币数,使探险家能够娶到酋长的女儿。
转载地址:http://qdkzz.baihongyu.com/