AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← 返回题库

K0043. 魔法微灵的协作法则

困难通过率 71% · 提交 31 · 通过 22
图论拓扑排序哈希表模拟

在「小慕」负责的分布式微服务系统中,存在一种称为微灵(MicroSpirit)的服务单元。这些微灵可以被部署到不同的服务器节点上运行,构成一个复杂的服务调用网络。每个微灵都能提供某种功能,但有些微灵的正常工作于其他微灵的存在。 系统的运行规则如下: 1. 部署规则:每个微灵在同一台服务器上只能有一个运行实例,但可以被部署到多台服务器上。 2. 可用性规则: - 若一个微灵没有依赖,只要它在任意一台服务器上有运行实例,即可正常工作; - 若有依赖,只有当: - 它自身至少有一个运行实例; - 所有它依赖的微灵都已处于正常工作状态; 才能正常工作。 举例说明: 某时刻,微灵 A 依赖微灵 B,B 又依赖 C,而 C 没有依赖。 - 若 C 至少有一个运行实例,则 C 可正常工作; - 若 B 至少有一个运行实例,则 B 可正常工作; - 若 A 至少有一个运行实例,则 A 也可正常工作; 然而,如果 B 的所有实例都被关闭(即服务器重启后未重新启动微灵),则 A 和 B 都无法正常工作,但 C 仍可。 你的任务是模拟这个微服务系统的运行过程。 方法说明 - `ServiceWgSys()` 初始化微服务系统。假设所有服务器已预加载所有微灵的代码包。 - `bool startService(int serverId, const string& serviceName)` 在服务器 `serverId` 上启动微灵 `serviceName`。 - 若该微灵已在此服务器运行,返回 `false`; - 否则将其启动并返回 `true`。 - `bool addDependency(const string& fromService, const string& toService)` 设定微灵 `fromService` 依赖 `toService`。 - 若该依赖已存在,返回 `false`; - 否则建立依赖关系,返回 `true`。 - `bool isServiceAvailable(const string& serviceName)` 查询微灵 `serviceName` 当前是否能正常工作。 - 若能,返回 `true`;否则返回 `false`。 - `void rebootServers(const vector& serverIds)` 重启指定的服务器列表 `serverIds`。这些服务器上的微灵将全部停止运行,需手动重新启动。

提示:带虚线的词点一下有通俗解释。

输入描述

第一行为一个整数 `Q`,表示命令的总条数。 接下来 `Q` 行,每行表示一次操作命令,格式如下: - 初始化命令(只能出现一次,且必须为第 1 行): ``` ServiceWgSys ``` - 启动微服务: ``` startService <serverId> <serviceName> ``` - 添加微服务依赖: ``` addDependency <fromService> <toService> ``` - 查询某个微服务是否可提供服务: ``` isServiceAvailable <serviceName> ``` - 批量重启服务器: ``` rebootServers <n> // 表示接下来有 n 个 serverId <id1> <id2> ... // 一行输入 n 个服务器编号,用空格分隔 ``` 参数约束 - `1 <= Q <= 1000` - `0 <= serverId <= 1000` - 所有服务器编号在 rebootServers 命令中互不相同 - 所有服务名由英文字母或数字组成,`0 < len(serviceName) < 15`

输出描述

第一行输出固定为: ``` null ``` 之后的每一行对应每条命令的返回结果: - 对于 `ServiceWgSys()` 和 `rebootServers(...)` 命令,输出: ``` null ``` - 对于 `startService(...)`、`addDependency(...)`、`isServiceAvailable(...)` 命令,输出: ``` True ``` 或: ``` False ```

示例

示例 1

输入

13
ServiceWgSys
startService
1
serviceA
startService
2
serviceA
startService
2
serviceA
addDependency
serviceB
serviceA
rebootServers
1
2
isServiceAvailable
serviceA
startService
2
serviceB
isServiceAvailable
serviceB
rebootServers
2
2 1
isServiceAvailable
serviceA
startService
1
serviceA
isServiceAvailable
serviceA

输出

null
True
True
False
True
null
True
True
True
null
False
True
True

说明:| 行数 | 命令 | 说明 | 输出 | |------|------|------|------| | 1 | `ServiceWgSys` | 初始化微服务系统 | `null` | | 2 | `startService 1 serviceA` | 在服务器1启动 serviceA,成功启动 | `True` | | 3 | `startService 2 serviceA` | 在服务器2也启动 serviceA,成功 | `True` | | 4 | `startService 2 serviceA` | 再次尝试在服务器2启动同一个微服务,已存在,失败 | `False` | | 5 | `addDependency serviceB serviceA` | 设置:serviceB 依赖 serviceA | `True` | | 6 | `rebootServers [2]` | 重启服务器2,停止其所有微服务实例 | `null` | | 7 | `isServiceAvailable serviceA` | serviceA 仍在服务器1运行,可提供服务 | `True` | | 8 | `startService 2 serviceB` | 在服务器2启动 serviceB,成功 | `True` | | 9 | `isServiceAvailable serviceB` | serviceB 本身运行,且依赖的 serviceA 也可提供服务 | `True` | |10 | `rebootServers [2, 1]` | 重启服务器1和2,所有微服务实例停止 | `null` | |11 | `isServiceAvailable serviceA` | 所有 serviceA 实例停止,无法提供服务 | `False` | |12 | `startService 1 serviceA` | 在服务器1重新启动 serviceA,成功 | `True` | |13 | `isServiceAvailable serviceA` | serviceA 再次运行,有实例,因此可用 | `True` |

时间限制 1000 ms · 内存限制 128 MB

看不懂题目?点开图解
魔法微灵依赖关系示例 微灵 A 依赖 B 微灵 B 依赖 C 微灵 C 无依赖 服务器 1 运行: A, C 服务器 2 运行: B, C 服务器 3 运行: 无 每个微灵可在多台服务器上运行,但每台服务器最多一个分身 微灵释放魔力条件:自身有分身运行 + 所有依赖微灵都可释放
写完代码点「提交」,将对全部测试用例判题。

向老师提问

针对「魔法微灵的协作法则」把疑问、代码和报错填清楚,老师收到后能更快、更准地回复你。