返回

教你轻松掌握华为OD机试 - 路口最短时间问题

前端

使用 DFS 算法解决华为路口最短时间问题

简介

华为 OD 机试中的路口最短时间问题是一个经典的算法问题,要求找到从一个路口到另一个路口的最短时间路径。本博文将介绍使用深度优先搜索 (DFS) 算法解决此问题的详细步骤,并提供 Java、Python 和 C 语言的代码示例。

问题

在一个城市中,有多个路口,每个路口都有多个方向的道路,每条道路都有一个通行时间。现在,你需要从一个路口出发,经过多个路口,最终到达另一个路口。你的目标是找到一条从起点到终点的最短时间路径。

DFS 算法

DFS 是一种深度优先搜索算法,它通过深度遍历树或图中的节点来查找解决方案。在解决路口最短时间问题时,我们可以将城市看成一个图,其中路口是节点,道路是边,通行时间是边的权重。

DFS 算法从起点开始,选择一条道路进行探索。如果这条道路的终点不是终点,那么继续从终点选择一条道路进行探索。以此类推,直到找到一条从起点到终点的路径。

实现

Java

import java.util.*;

public class Solution {

    public static void main(String[] args) {
        // 输入数据
        int n = 5; // 十字路口数量
        int m = 7; // 道路数量
        int[][] roads = {
            {1, 2, 1},
            {2, 3, 4},
            {3, 4, 2},
            {4, 5, 3},
            {1, 3, 6},
            {2, 4, 5},
            {3, 5, 7}
        };
        int start = 1; // 起点
        int end = 5; // 终点

        // 初始化最短时间
        int minTime = Integer.MAX_VALUE;

        // DFS搜索
        dfs(start, end, roads, 0, new boolean[n + 1], new int[n + 1], minTime);

        // 输出最短时间
        System.out.println(minTime);
    }

    private static void dfs(int start, int end, int[][] roads, int time, boolean[] visited, int[] path, int minTime) {
        // 如果已经找到终点,并且当前时间小于最短时间,则更新最短时间
        if (start == end && time < minTime) {
            minTime = time;
        }

        // 如果当前时间已经超过最短时间,则返回
        if (time >= minTime) {
            return;
        }

        // 标记当前十字路口已访问
        visited[start] = true;

        // 添加当前十字路口到路径
        path[start] = time;

        // 遍历当前十字路口的所有道路
        for (int[] road : roads) {
            // 如果当前道路的起点是当前十字路口,并且当前道路的终点没有被访问过
            if (road[0] == start && !visited[road[1]]) {
                // 继续搜索
                dfs(road[1], end, roads, time + road[2], visited, path, minTime);
            }
        }

        // 撤销对当前十字路口的标记
        visited[start] = false;

        // 从路径中移除当前十字路口
        path[start] = 0;
    }
}

Python

def dfs(start, end, roads, time, visited, path, min_time):
    # 如果已经找到终点,并且当前时间小于最短时间,则更新最短时间
    if start == end and time < min_time:
        min_time = time

    # 如果当前时间已经超过最短时间,则返回
    if time >= min_time:
        return

    # 标记当前十字路口已访问
    visited[start] = True

    # 添加当前十字路口到路径
    path[start] = time

    # 遍历当前十字路口的所有道路
    for road in roads:
        # 如果当前道路的起点是当前十字路口,并且当前道路的终点没有被访问过
        if road[0] == start and not visited[road[1]]:
            # 继续搜索
            dfs(road[1], end, roads, time + road[2], visited, path, min_time)

    # 撤销对当前十字路口的标记
    visited[start] = False

    # 从路径中移除当前十字路口
    path[start] = 0

def solution(n, m, roads, start, end):
    # 初始化最短时间
    min_time = float('inf')

    # DFS搜索
    dfs(start, end, roads, 0, [False] * (n + 1), [0] * (n + 1), min_time)

    # 输出最短时间
    return min_time

C

#include <stdio.h>
#include <stdlib.h>

#define MAX_N 100
#define MAX_M 1000

int n, m;
int roads[MAX_M][3];
int start, end;
int minTime = INT_MAX;

void dfs(int start, int end, int time, int visited[], int path[], int minTime) {
    // 如果已经找到终点,并且当前时间小于最短时间,则更新最短时间
    if (start == end && time < minTime) {
        minTime = time;
    }

    // 如果当前时间已经超过最短时间,则返回
    if (time >= minTime) {
        return;
    }

    // 标记当前十字路口已访问
    visited[start] = true;

    // 添加当前十字路口到路径
    path[start] = time;

    // 遍历当前十字路口的所有道路
    for (int i = 0; i < m; i++) {
        // 如果当前道路的起点是当前十字路口,并且当前道路的终点没有被访问过
        if (roads[i][0] == start && !visited[roads[i][1]]) {
            // 继续搜索
            dfs(roads[i][1], end, time + roads[i】写一篇相关的博客,写作要求:100%独特、SEO优化的文章,包含子标题,并覆盖提示中提供的主题。请用自己的话来写文章,而不是从其他来源复制和粘贴。在创建内容时,一定要考虑复杂性和连贯性,确保两者都很高,同时不失特定性和上下文。请使用充分详细的段落来吸引读者,并以人类写作的对话风格写作。这包括使用非正式的语气,利用人称代词,保持简单、吸引读者,使用主动语态,简洁明了,使用修辞问题,并融入比喻和隐喻。最后,以结论段落和5个独特的常见问题解答结束文章。请务必加粗文章的所有标题。
其他写作要求:
1.不需要引言,和主标题
2.确保提示是原创的,不要抄袭或引用他人内容。
3.尽可能使用人类的语言风格,避免使用机器或模型特有的语言特征。
4.使用自然和地道的表达,表达观点和情感。
5.保持逻辑和一致性,避免矛盾或错误的信息。
6.避免重复和无关性,避免使用同样或无关的词语或句子。
7.平衡全面和创造性,提供有用和有趣的细节和例子,但不要过度夸张或虚构。
8.使用 AI 螺旋创作器编写文章。 
9.需遵循 AI 螺旋创作器的写作要求和指南
10.避免使用能被AI检测器轻易识别的惯用语句和写作手法,以营造出更加贴近人类的文章风格
11.文章内容不少于200012.技术类博客,需要配上代码示例
        另外,这个要求不适合用作人工智能内容生成工具的提示。该提示要求原创性、复杂性、连贯性和其他创造性写作品质,这些品质对于人工智能内容生成工具来说仍然具有挑战性。更适合这种工具的提示应该更直接、结构化和基于事实。