两座城市之间的最短路径——最多经停 K 次

给定一个由 N 个节点和 E 条边组成的图,边的形式为 {U, V, W},表示 UV 之间存在一条权重为 W 的边。现在给定一个整数 K 以及起点 src 和终点 dst。我们的任务是找到从起点到终点,且经停次数不超过 K 次的最便宜路径。

示例:

> 输入: N = 3, edges = [[0, 1, 100], [1, 2, 100], [0, 2, 500]], src = 0, dst = 2, k = 1

> 输出: 200

> 解释:

> 从城市 0 到城市 2 的最便宜价格是 200。在只经停一次的情况下,正好花费 200,这就是我们的输出结果。

> 输入: N = 3, edges = [[0, 1, 100], [1, 2, 100], [0, 2, 500]], src = 0, dst = 2, k = 0

> 输出: 500

方法 1:使用 深度优先搜索

在这个方法中,我们将采取以下步骤:

  • 探索当前节点,并持续探索其子节点。
  • 使用一个 映射来存储已访问的节点,并将经停次数和距离作为值配对存储。
  • 如果映射中存在当前键,则中断递归树(剪枝)。
  • 找出每个递归树的答案(即最小成本)并返回。

下面是我们这种方法的实现。

C++


CODEBLOCK_c3e2af12

Java

`

// Java program for the above approach
import java.util.HashMap;

public class SingleS {

    // DFS memoization
    static int adjMatrix[][];
    static HashMap mp
        = new HashMap();

    // Function to implement DFS Traversal
    static int DFSUtility(int node, int stops, int dst,
                          int cities)
    {
        // Base Case
        if (node == dst)
            return 0;

        if (stops < 0)
            return Integer.MAX_VALUE;

        int[] key = new int[] { node, stops };

        // Find value with key in a map
        if (mp.containsKey(key))
            return mp.get(mp);

        int ans = Integer.MAX_VALUE;

        // Traverse adjacency matrix of
        // source node
        for (int neighbour = 0; neighbour  0) {
                // Recursive DFS call for
                // child node
               
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/28970.html
点赞
0.00 平均评分 (0% 分数) - 0