目录
题目
有若干个连续编号的服务(编号从0开始),服务间有依赖关系,启动一个指定服务,请判断该服务是否可以成功启动,并输出以来的前置服务编号(依赖关系是可以传递的,比如服务2依赖服务1,服务1依赖于服务0,那么服务2依赖于服务1和服务0)。
输入描述
第一行输入为N,N为服务的总个数(1 <= N <= 5000)
第二行输入为M,M为指定启动服务的编号(0 <= M < 5000)
接下来的N行,是从编号0服务~编号N-1服务的服务依赖表,每一行第一个数字是该服务依赖的服务个数T(0 <= T < 5000),后面T个数字分别是对应的依赖服务编号输出描述
为了避免不同算法的服务加载顺序不同,请从服务编号从小到大以此输出所有前置服务的编号,不包括指定启动的服务编号自身。如果没有依赖的前置服务则输出null。
如果服务无法启动(出现循环依赖,则服务无法启动,样例2为最简单的循环依赖)或其它异常,输出-1.
样例1
输入
4
2
0
1,0
1,1
2,0,1
输出
0,1
解释:
第一行,4,一共四个服务,编号0~3
第二行,2,指定启动编号为2的服务
第三行开始为服务依赖关系表
第三行,0,表示服务0,没有依赖的前置任务,依赖个数为0
第四行,1,0,表示服务1,依赖1个前置任务,编号为0
第三行,1,1,表示服务2,依赖1个前置任务,编号为1
第三行,2,1,0 表示服务3,依赖2个前置任务,编号为0和1
分析,服务启动顺序为0,1,2,可成功启动服务2,输出0,1样例2
输入
2
1
1,1
1,0
输出
-1
思路
1:重点在于从题目信息中挖掘出题目考点,能否启动成功,意味着各个服务之间的依赖关系是否满足一定条件,节点之间相互依赖的场景,很容易想到图一类的问题,根据题目中:”出现循环依赖,则服务无法启动“,可以得出,若图中存在环,有循环依赖,就是启动失败的条件。题目的问题就变成了判断图中是否有环。
2:典型的DFS或者BFS问题,代码逻辑:
读取输入
- 读取整数
n
(表示节点个数)。- 读取整数
m
(表示要检查的目标节点)。- 读取
n
行数据,每行包含一个整数k
(表示当前节点的依赖数量),后面跟着k
个依赖节点。构建依赖关系图
- 用
dependencys
数组存储每个节点的依赖列表。深度优先搜索(DFS)
- 遍历
m
的所有依赖节点,记录所有能到达的节点。- 若在 DFS 过程中遇到已经访问过的节点,则说明存在环,设置
loop_flag = true
并终止搜索。输出结果
- 如果存在环,输出
-1
。- 否则,将
dependency_numbers
里的元素升序排序,并按,
连接输出。
考点
1:DFS/BFS
Code
function findDependencies(n, m, dependencies) {
let dependencyNumbers = new Set(); // 存储依赖节点
let loopFlag = false; // 标记是否存在环
// 深度优先搜索(DFS)
function dfs(node, visited) {
if (visited.has(node)) {
loopFlag = true; // 发现环
return;
}
if (!loopFlag) {
if (node !== m) dependencyNumbers.add(node);
visited.add(node);
for (let dep of dependencies[node]) {
dfs(dep, visited);
}
visited.delete(node); // 回溯
}
}
let visited = new Set();
dfs(m, visited);
if (loopFlag) {
console.log(-1);
} else {
console.log(Array.from(dependencyNumbers).sort((a, b) => a - b)); // 升序返回依赖节点列表
}
}
findDependencies(4,
2,
[[],[0],
[1],
[0,1]]);
要求
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K
64bit IO Format:%lld
语言限定:
C(clang11), C++(clang++11), Pascal(fpc 3.0.2), Java(javac 1.8), Python2(2.7.3),
PHP(7.4.7), C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript Node(12.18.2), JavaScript V8(6.0.0),
Sqlite(3.7.9), R(4.0.3), Go(1.14.4), Ruby(2.7.1), Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13),
Pypy3(pypy3.6.1), Rust(1.44), Scala(2.11.12), Kotlin(1.4.10), Groovy(3.0.6), TypeScript(4.1.2), Mysql(8.0)
更多题目链接:
华为OD 2025 最新最全机试题库及讲解,A+B+C+D+E卷题库大全。
Java题库: 2024华为OD机试(JAVA)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od机试真题-CSDN博客
Python题库: 2024华为OD机试(Python)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od机试好过吗-CSDN博客
C++题库: 2024华为OD机试(C++)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od怎么知道考的是a卷还是b卷-CSDN博客
Js题库: 2024 华为OD机试(JavaScript)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od 2023 q2b卷-CSDN博客