【笔试刷题】京东-2026.03.21-第三套-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

京东-2026.03.21-第三套

这套目前只有一道图论题,但题型非常标准。题面表面是在“已有通道 + 候选新通道”里做规划,落地时要先把免费边缩成若干连通块,随后对候选边跑一遍 Kruskal。

题目一:星港联通计划

如果直接把已有通道和候选通道混在一起想,很容易绕进“怎么选组合”的细节里。更直接的切入点是:已有通道先并进并查集,后面只需要在连通块之间补最便宜的边,这就是最小生成树的原型。

难度:中等

01. 星港联通计划

问题描述

小柯正在维护一张由空中补给站组成的星港网络。

现在一共有 个星港,已经稳定运行的连接通道有 条。除此之外,工程组还给出了 条候选新通道,每条候选方案都有一个建造成本。

你需要从这 条候选新通道里选出若干条进行建造,使得所有星港最终都能互相连通,并且总代价最小。

输入格式

第一行输入三个整数 ,分别表示星港数量、已开通通道数量和候选新通道数量。

接下来 行,每行输入两个整数 ,表示星港 和星港 之间已经有一条稳定通道。

再接下来 行,每行输入三个整数 ,表示修建星港 和星港 之间的新通道需要成本

输出格式

输出一个整数,表示让所有星港连通所需的最小总代价。

样例输入

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

样例输出

6

样例说明

星港 和星港 原本已经连通。再修建:

  • ,成本为
  • ,成本为

就能让四个星港全部连通,总成本是 ,这是最优方案。

数据范围

样例 解释说明
样例1 原有航线先把部分站点并起来,再从候选边里补最便宜的连接边即可。

题解

这题的核心不在“选哪些新航线”,而在于先把原本已经连通的部分缩成若干个连通块。

一旦这么看,后面的目标就很清楚了:

  • 已有航线免费使用;
  • 候选新航线按成本付费;
  • 只要把这些连通块用最小代价连成一个整体。

这就是标准的最小生成树模型,直接用 Kruskal 即可。

第一步:先把已有航线合并掉

题目里给的 条已开通航线不需要额外花钱,所以它们本质上就是“已经存在的边”。

我们先开一个并查集,把这些边对应的端点全部合并:

  • 如果 之间原本就有航线,就说明它们已经在同一个连通区域里。
  • 这一阶段只做合并,不累计成本。

处理完以后,整张图会被分成若干个初始连通块。

第二步:对候选新航线做 Kruskal

把所有候选新航线按成本从小到大排序。

然后依次枚举每一条边:

  • 如果这条边的两个端点已经在同一个连通块里,说明它只会形成环,跳过。
  • 如果不在同一个连通块里,就把它加入答案,并把两个连通块合并。

因为我们始终优先拿当前能连接两个不同连通块的最小成本边,所以这正是 Kruskal 的贪心过程。

为什么这样一定最优

已有航线已经把图压成了若干个免费连通块。剩下要做的,只是用候选边把这些块接起来。

而在任意一步里,如果两块还没连通,Kruskal 选择的是当前能连接它们的最便宜边。根据最小生成树的切分性质:

  • 在某个割上,权值最小的可选边一定可以出现在某一棵最小生成树里。

所以把候选边按成本从小到大尝试、只在两端还没连通时使用,最后得到的总代价就是最小值。

复杂度分析

设候选新航线数量为

  • 排序复杂度:
  • 并查集合并与查询复杂度:
  • 总时间复杂度:
  • 空间复杂度:

参考代码

  • Python
import sys

input = lambda: sys.stdin.readline().strip()


class DSU:
    def __init__(self, n):
        self.fa = list(range(n + 1))

    def find(self, x):
        while self.fa[x] != x:
            self.fa[x] = self.fa[self.fa[x]]
            x = self.fa[x]
        return x

    def union(self, x, y):
        fx = self.find(x)
        fy = self.find(y)
        if fx == fy:
            return False
        self.fa[fx] = fy
        return True


def solve():
    n, m, k = map(int, input().split())
    dsu = DSU(n)

    # 先合并已经开通的免费航线。
    for _ in range(m):
        a, b = map(int, input().split())
        dsu.union(a, b)

    edges = []
    for _ in range(k):
        a, b, v = map(int, input().split())
        edges.append((v, a, b))

    edges.sort()
    ans = 0

    # 再按成本从小到大补边。
    for v, a, b in edges:
        if dsu.union(a, b):
            ans += v

    root = dsu.find(1)
    for i in range(2, n + 1):
        if dsu.find(i) != root:
            print(-1)
            return
    print(ans)


if __name__ == "__main__":
    solve()
  • Cpp
#include <bits/stdc++.h>
using namespace std;

struct DSU {
    vector<int> fa;

    explicit DSU(int n) : fa(n + 1) {
        iota(fa.begin(), fa.end(), 0);
    }

    int find(int x) {
        if (fa[x] == x) {
            return x;
        }
        return fa[x] = find(fa[x]);
    }

    bo

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

昨天 12:14
山东大学 Java
1.你的登录功能是基于什么来实现的呢?2.你使用了多级缓存,redis+本地缓存,那你的本地缓存是怎么去实现的?3.如果redis和DB库存不一致导致超卖了怎么办?4.如果redis和DB库存不一致,如何让用户感知到下单失败?5.如果抢票只有一张票,但是有上千万和请求到来,如何进行处理?不用消息队列的话?比如令牌桶?限流?6.用redis来实现全局唯一ID是如何来实现的?会不会导致7.项目有做分布式的部署么?如何实现?8.了解什么是Function&nbsp;call,什么是mcp,什么是skill么?9.平时编程有用什么AI么?10.Java面向对象的三大特性是什么呢?有什么含义?11.子类中如何引用父类的方法?12.父类对象的引用可以调用指向子类的新方法么?13.重载和重写有什么不一样么?14.如果重载里面的参数是list,但是泛型不一样,算重载么?15.被哪些修饰修饰的方法是可以重写的?16.Java的static方法有哪些作用?17.有什么办法在静态方法里面调用非静态的方法?18.Java常见的集合或者说集合框架有哪些?19.Concurrenthashmap是如何实现的?20.Java里面有哪些创建线程的方法?21.线程池的有哪些参数?他们具体什么含义?22.为什么要尽量使用自己定义的线程池?23.Thread&nbsp;local的实现是什么?它里面用了什么引用?24.排查过内存泄露的例子么?如何排查内存泄露?25.如何去排查OOM?26.Spring中的autowired和resource注解有什么区别么?27.Spring的bean默认是单例还是多例的?如何创建多例的bean?28.如果依赖注入的时候接口有两个实现,怎么是选择要注入哪个?29.Spring的IOC和DI是什么意思?30.用过spring的切面么?如何使用切面?31.MySQL有哪些隔离级别?他们怎么实现?为什么使用Mvcc解决可重复读?32.MySQL的索引失效的场景有哪些?33.索引是越多越好么?34.为什么平时实际生产要反范式?35.数据库的Join有哪几种方式join啊?有两个表,一张是交易的表,一张是结算的表,交易会每天给把它收到的订单给结算发一份。两个表都有订单号字段,如果有人在结算的表插入订单(不在交易的表)或者交易给结算的表丢失部分数据,如何去排查这些异常的数据?36.计算机网络的tcp协议如何做拥塞控制?37.Tcp头部的内容了解么?有哪些字段?38.手撕:K个一组翻转链表回答了七八成的问题吧,手撕六分钟写出来,面完直接约二面
牛客在线求职答疑中心
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务