华为机试真题20250611(含java代码)

第一题(DFS)

题目:

物流公司每天都要处理很多物流的运输工作,整个城市共有 ( N ) 个地点,共有 ( N - 1 ) 条公路,每 2 个地点之间都能通过公路连通。物流公司总部位于 1 号地点。 今天有一辆物流运输车共有 ( M ) 条物流运输任务,物流运输车每天的工作流程如下: 先要从总部出发去收取所有的寄件货物,收到所有货物后回到总部扫描货物,再从总部出发将货物送至所有的送件地址,送完后最终回到总部,算作完成了今天的运输工作。 请问该辆物流运输车今天最少行驶多少路程可以完成今天的运输工作,运输任务不分先后。

对于每组数据,第一行有 2 个整数,表示有 ( N ) 个地点和 ( M ) 条物流任务,数字用空格分开。 接下来有 ( N - 1 ) 行,每行有 3 个整数表示从 ( u ) 到 ( v ) 有一条公路,公路里程为 ( c ),输入保证所有地点连通。 接下来有 ( M ) 行,每行有 2 个整数,表示寄件任务从 ( s ) 寄到 ( t )。

输出一个整数,表示该辆物流运输车最少行驶多少路程能够完成今天的运输工作。

4 2                                     10
2 1 1
1 3 2
4 3 2
3 2
4 2

5 2                                     24
2 1 1
1 3 2
4 3 2
1 5 3
4 2
5 4

参考代码:

import java.util.*;
import java.io.*;

public class Main {
    static class Edge {
        int v, w;
        Edge(int v, int w) {
            this.v = v;
            this.w = w;
        }
    }

    static List<List<Edge>> adj; 
    static boolean[] isSource, isDest;
    static long sourceSum, destSum;

    //如果当前节点是取件点,或者它某个子节点返回了 true(说明子树中有取件点),就说明这条边必须被计入路径中。    
    static boolean dfsSource(int u, int parent) {
        boolean hasSource = isSource[u];
        for (Edge e : adj.get(u)) {
            if (e.v == parent) continue;
            if (dfsSource(e.v, u)) {
                sourceSum += e.w;
                hasSource = true;
            }
        }
        return hasSource;
    }

    static boolean dfsDest(int u, int parent) {
        boolean hasDest = isDest[u];
        for (Edge e : adj.get(u)) {
            if (e.v == parent) continue;
            if (dfsDest(e.v, u)) {
                destSum += e.w;
                hasDest = true;
            }
        }
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值