快递投放问题

华为OD机试真题 Java&Go 实现【快递投放问题】【2023 Q1 | 100分】 有N个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递? 阅读详情

题目描述

  • 有NNN个快递站点用字符串标识,某些站点之间有道路连接。
  • 每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递?

输入描述

  • 第一行输入MNM\quad NMN,MMM个包裹和NNN个道路信息
  • 0≤M,N≤1000\leq M,N \leq 1000≤M,N≤100
  • 检查站禁止通行的包裹如果有多个,则以空格分开

输出描述

  • 输出不能送达的包裹,如package2、package4
  • 如果所有的包裹都能送达则输出:none
  • 输出结果按照升序排列

用例

4 2
package1 A C
package2 A C
package3 B C
package4 A C
A B package1
A C package2

--输出
package2

题目解析

这个题目极其难以理解,文字越少越难理解。

提取关键点

  • 首先注意到数据范围是[0,102][0, 10^2][0,102]
    • 这个数据范围下,可以重复多次遍历
  • MMM个包裹信息,这快比较好理解,如用例
    • package1 A C:表示了需要把包裹 package1 从站点 A 运送到 站点 C
    • 这里隐藏一个信息,是否存在这样的用例 package1 C A,即把包裹从站点 C 运送到 站点 A
      • 这一点还是要考虑到的
  • 根据题目描述和输入描述
    • 题目描述:有 NNN 个快递站点用字符串标识,某些站点之间有道路连接
    • 输入描述:NNN个道路信息
    • 这两个NNN的意义是否相同?这里肯定是不相同的,为什么?
      • 因为一个道路可以连接两个站点
    • 那么根据输入描述,根据用例中的道路信息可以知道快递站点之间的关系如下。
    • image.png
    • 这里根据用例 package3 B C 可以得到一个关键信息,快递投放可以通过站点之间进行中转
    • 至此,分析完毕,问题转化成了求图中是否存在有效路径的问题.

show code

package com.hw;

import java.util.*;

/**
 * desc :
 * <p>
 * create time : 2023/8/17 17:23
 */
public class DeliverPathFinderBetter {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        String[] split = in.nextLine().split(" ");
        // M 个包裹.
        int M = Integer.parseInt(split[0]);
        // N 个道路信息.
        int N = Integer.parseInt(split[1]);

        // 包裹信息,表示包裹需要从 一个站点运输到另一个站点.
        String[][] pkgMsgS = new String[M][];

        for (int i = 0; i < M; i++) {
            pkgMsgS[i] = in.nextLine().split(" ");
        }

        // 道路信息以及在目标道路上禁止运送的包裹信息.
        String[][] banPkgS = new String[N][];
        for (int i = 0; i < N; i++) {
            banPkgS[i] = in.nextLine().split(" ");
        }

        deliverPathFinderBetter(pkgMsgS, banPkgS);
    }

    private static void deliverPathFinderBetter(String[][] pkgMsgS, String[][] banPkgS) {
        // 包裹运送信息--适合用 map 来存储
        Map<String, String[]> deliverMap = new HashMap<>();

        for (String[] pkgMsg : pkgMsgS) {
            String[] startToEnd = {pkgMsg[1], pkgMsg[2]};
            //  包裹不能重复,直接 put.
            deliverMap.put(pkgMsg[0], startToEnd);
        }

        // 根据道路信息,构造图数据.
        Map<String, List<String>> graph = new HashMap<>();
        // 用一个map,保存 禁止运输的 包裹信息.
        Map<String, Set<String>> banMap = new HashMap<>();
        // 处理数据.
        for (String[] banPkg : banPkgS) {
            String site1 = banPkg[0];
            String site2 = banPkg[1];
            String[] bans = Arrays.copyOfRange(banPkg, 2, banPkg.length);
            // 建图数据结构.
            graph.computeIfAbsent(site1, k -> new ArrayList<>()).add(site2);
            graph.computeIfAbsent(site2, k -> new ArrayList<>()).add(site1);

            String key = (site1.charAt(0) - 'A') < (site2.charAt(0) - 'A') ? (site1 + "-" + site2) : (site2 + "-" + site1);
            // 禁止通行的包裹列表
            banMap.computeIfAbsent(key, k -> new HashSet<>()).addAll(Arrays.asList(bans));
        }

        dealPkgS(deliverMap, graph, banMap);
    }

    private static void dealPkgS(Map<String, String[]> deliverMap, Map<String, List<String>> graph, Map<String, Set<String>> banMap) {
        Set<String> unreachablePackages = new TreeSet<>();
        for (String pkg : deliverMap.keySet()) {
            // 当前将要运送的包裹是  pkg, 需要运送其从站点  start 到 end  .
            String[] path = deliverMap.get(pkg);
            String start = path[0].charAt(0) - 'A' < path[1].charAt(0) - 'A' ? path[0] : path[1];
            String end = path[0].charAt(0) - 'A' < path[1].charAt(0) - 'A' ? path[1] : path[0];


            // 查看是否存在可通行的路径.
            // 用一个set记录路径——即所到达的站点.
            Set<String> visited = new HashSet<>();
            if(!dfs(pkg, start, end, graph, visited, banMap)) {
                unreachablePackages.add(pkg);
            }
        }

        if(unreachablePackages.size() == 0) {
            System.out.println("none");
        } else {
            for (String unreachablePackage : unreachablePackages) {
                System.out.print(unreachablePackage + " ");
            }
        }
    }

    private static boolean dfs(String pkg,
                               String start,
                               String end,
                               Map<String, List<String>> graph,
                               Set<String> visited,
                               Map<String, Set<String>> banMap) {
        if (start.equals(end)) {
            // 到达了目标站点,那么这个时候返回 true ,表示该包裹可以到达目标站点.
            return true;
        }
        visited.add(start);
        for (String nextSite : graph.getOrDefault(start, Collections.emptyList())) {
            if(visited.contains(nextSite)) {
                // 去过的站点跳过.
                continue;
            }
            String key = start.charAt(0) - 'A' < nextSite.charAt(0) - 'A' ? start + "-" + nextSite : nextSite + "-" + start;
            if(banMap.containsKey(key) && banMap.get(key).contains(pkg)) {
                // 当前路径不允许当前包裹通过.
                continue;
            }
            if(dfs(pkg, nextSite, end, graph, visited, banMap)) {
                return true;
            }
        }
        return false;
    }

}

华为OD机试 - 快递投放问题(Python)【2023-Q1 新题】 快递投放问题 题目描述 有 N 个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复, 路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递 输入描述 第一行输入M N,M个包裹N 个道路信息. 0 阅读详情

相关推荐

2023华为OD机试真题【快递投放/哈希表】

查找无法送达的包裹。对于每个站点组合,检查是否有禁止通行的包裹。如果有,检查包裹是否在禁止通行的列表中。如果在禁止通行的列表中,将包裹名称添加到。每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递?有N个快递站点用字符串标识,某些站点之间有道路连接。接下来的4行是每个包裹的名称, 起点, 终点。1、第一行输入M N,M个包裹N个道路信息。最后2行是两个站点之间无法通行的包裹名称。是包裹名称和禁止通行的包裹名。4个包裹,2个禁止通行信息。

wtswts1232的博客 574

gre 北美范文 出国考试资料

gre 北美范文 出国考试资料 ,包含写作的模板 ,写作考试的必备资料 。。。

【200分】【快递投放问题】

字典,对于每个站点和目的地的组合,检查其中的禁止通行包裹列表。输出不能送达的包裹 package2 package4,如果所有包裹都可以送达则输出none,输出结果按照升序排列。第一行输入M N,M个包裹N个道路信息. 0

weixin_54707168的博客 487

华为OD题目:快递投放问题

华为OD题目:快递投放问题

weixin_45611920的博客 529

【华为OD机试真题2023 JAVA&JS】快递投放问题

快递投放问题 知识点图BFS搜索 时间限制:1s空间限制:256MB限定语言:不限 题目描述:有N个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递

qq_34465338的博客 3056

【首发独家】华为OD机试 -快递投放问题(GO 语言解题)

华为od机试,独家整理 已参加机试人员的实战技巧 本篇华为OD机试题解:快递投放问题 题目描述 有 N 个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复, 路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

2025华为OD机试真题E卷 C语言 实现【快递投放问题】

有N个快递站点用字符串标识,某些站点之间有道路连接。 每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递?

MISAYAONE的博客 636

快递投放问题算法题详解

每个站点都有一定数量的包裹需要运输,而且每个站点间的包裹是不重复的。如果存在,就将两个集合求交集,得到的就是该道路上无法通行的包裹。行,每行表示一条道路上的检查站信息,格式为起点站点、终点站点以及被禁止通行的包裹名称,如果有多个被禁止的包裹,它们之间用空格分隔。对于包裹的运输路径信息,我们将其按照 [key = “起点-终点”] = {包裹1, 包裹2, …具体来说,使用两个字典来分别存储包裹的运输路径信息和道路的禁止通行信息。输出时,需要输出不能送达的包裹名称,这些名称按照升序排列。

m0_62153576的博客 239

华为OD机试真题 JS 实现【快递投放问题】【2023 Q1 | 100分】

有N个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递?

MISAYAONE的博客 6508

【华为OD机考真题】- 快递投放问题(Java)

🔔本文收录于「2025华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!

**My Coding Family** 1102

【华为OD机试】真题A卷-快递投放问题(Python)

【华为OD机试】真题A卷-快递投放问题(Python):有N个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递?

u014481728的博客 751

华为OD机试详解:快递投放问题的深度分析与实现——基于C++/Java/JavaScript/Python的详细解读

在这道题目中,我们通过多种编程语言实现了快递投放问题的解法。无论是哪种语言,解题思路的核心是使用哈希表或字典对包裹和路径进行映射,从而快速查找哪些包裹无法正常送达。我们还通过集合高效管理每条路径上的受限包裹。

m0_57781768的博客 460

华为OD机试用 JS 实现 -【快递投放问题】(2023抽中题)

华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.youkuaiyun.com/hihell/category_12199275.html 华为OD详细说明:https://dream.blog.youkuaiyun.com/article/details/128980730 本篇华为OD机试题解:快递投放问题

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

【华为OD机试】真题A卷-快递投放问题(JAVA)

【华为OD机试】真题A卷-快递投放问题(JAVA):有N个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递?

u014481728的博客 660

【华为OD机试真题2023 JS】快递投放问题

快递投放问题 知识点图BFS搜索 时间限制:1s空间限制:256MB限定语言:不限 题目描述:有N个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递

weixin_40767375的博客 273

华为OD机试 - 快递投放问题(Python)

每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递?输出不能送达的包裹,如:package2 package4,有N个快递站点用字符串标识,某些站点之间有道路连接。第一行输入M N,M个包裹N个道路信息.检查站禁止通行的包裹如果有多个以空格分开。如果所有包裹都可以送达则输出:none,输出结果按照升序排列。

m0_46181452的博客 1112

华为OD机试真题 Python 实现【快递投放问题】【2023 Q1 | 100分】

有N个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递?

MISAYAONE的博客 1万+

别再花屏了!手把手教你用STM32CubeIDE搞定LVGL 8.3移植(附完整源码)

本文详细介绍了如何在STM32CubeIDE环境下成功移植LVGL 8.3,解决常见的花屏问题。从环境配置、显示驱动优化到编译警告处理,提供完整的实战方案和源码示例,帮助开发者快速实现流畅的嵌入式GUI界面。特别针对STM32平台的DMA2D加速和内存管理进行了深度优化。

weixin_33739646的博客 243
上一篇: HCIP学习笔记-华为云原生应用的解决方案-10
隙间光点
博客等级 码龄10年 29粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值