华为OD机试 - 最小传输时延 - 深度优先搜索DFS(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
      • 计算源节点1到目的节点5,符合要求的时延集合

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

某通信网络中有N个网络节点,用1到N进行标识。

网络通过一个有向无环图表示,其中图的边的值表示结点之间的消息传递时延。

现给定相连节点之间的时延列表times[i] = {u,v,w},u表示源节点,v表示目的节点,w表示u和v之间的消息传递时延。

请计算给定源节点到目的节点的最小传输时延,如果目的节点不可达,返回-1。

二、输入描述

第一行输入两个正整数,表示网络节点的个数N,M,用空格分割;

下面的M行表示两个节点之间的时延列表{u,v,w}

最后一行输入两个正整数,u表示源节点,v表示目的节点;

三、输出描述

输出一个整数,表示源节点到目的节点的最小时延。

四、解题思路

  1. 定义一个时延列表{u,v,w}的集合list;
  2. 将M行输入的时延列表{u,v,w}加入list;
  3. 递归调用,计算定源节点到目的节点,符合要求的时延集合;
  4. 计算给定源节点到目的节点的最小传输时延;
  5. 如果目的节点不可达,返回-1

五、Java算法源码

// 完成源节点到目的节点的时延集合
public static List<Integer> delayList = new ArrayList<>();
// 时延列表的集合
// 下面的M行表示两个节点之间的时延列表{u,v,w}
public static List<int[]> uvwList = new ArrayList<>();

/**
 * 3 3
 * 1 2 11
 * 2 3 13
 * 1 3 50
 * 1 3
 *
 * 24
 */
public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    // 网络节点的个数
    int N = sc.nextInt();
    // 时延列表的长度
    int M = sc.nextInt();

    // 下面的M行表示两个节点之间的时延列表{u,v,w}
    for (int j = 0; j < M; j++) {
        // u表示源节点,v表示目的节点,w表示u和v之间的消息传递时延
        int[] arr = new int[3];

        // u表示源节点
        arr[0] = sc.nextInt();
        if (arr[0] < 1 || arr[0] > N) {
            System.out.println("源节点输入值不合规");
            break;
        }

        // v表示目的节点
        arr[1] = sc.nextInt();
        if (arr[1] < 1 || arr[1] > N) {
            System.out.println("目的节点输入值不合规");
            break;
        }

        // w表示u和v之间的消息传递时延
        arr[2] = sc.nextInt();
        uvwList.add(arr);
    }

    // 源节点
    int begin = sc.nextInt();
    // 目的节点
    int end = sc.nextInt();

    // 计算源节点到目的节点,符合要求的时延集合
    getDelay(begin, end, 0);

    // 如果目的节点不可达,返回-1
    if (delayList.size() == 0) {
        System.out.println(-1);
    } else {
        // 计算给定源节点到目的节点的最小传输时延
        System.out.println(Collections.min(delayList));
    }
}

/**
 * 计算源节点到目的节点,符合要求的时延集合
 *
 * @param begin 源节点
 * @param end   目的节点
 * @param count 时延总数
 */
public static void getDelay(int begin, int end, int count) {
    // 遍历时延列表的集合List<{u,v,w}>
    for (int i = 0; i < uvwList.size(); i++) {
        int[] temp = uvwList.get(i);
        // 第一个节点 = 源节点
        if (temp[0] == begin) {
            // 如果动态源节点 = 目的节点,完成源节点到目的节点的网络传输
            if (temp[1] == end) {
                // 累加消息传递时延
                delayList.add(count + temp[2]);
                continue;
            }
            // 第二个节点 = 动态源节点,完成源节点到目的节点的网络传输
            getDelay(temp[1], end, count + temp[2]);
        }
    }
}

六、效果展示

1、输入

5 4
1 3 10
3 4 5
4 5 12
1 5 25
1 5

2、输出

25

3、说明

计算源节点1到目的节点5,符合要求的时延集合

1到3时延10 + 3到4时延5 + 4到5时延12 = 27;

1到5时延25;

所以源节点1到目的节点5的最小时延是25。

华为OD机试 - 最小传输时延 - 深度优先搜索DFS(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,深度优先,java)