华为OD机试真题:主次关联成环警告2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 200分题型其它语言题解点击跳转华为OD机试双机位C卷:主次关联成环警告C/C/Java/Python/Go/JS题目描述在ICT运维领域现网运维工程师面向对设备上报的众多告警往往需要筛选出最主要的告警优先处理次等级的告警或许为同一个根因导致的告警处理优先级会放后或者不处理这样就诞生出主次关联告警的概念。给定一系列告警的主次关联关系判断是否存在如下情况情况1同1个告警是否存在多个主告警。情况2输入的主次关联关系中是否存在环路。输入描述每个主次关联关系单独一行输入输入形式为主告警 次告警。例如25aba 68vup25aba为主告警68vup为次告警以空格分割主次告警的格式都为小写字母数字组成1告警名称长度 256。输出描述输出要求为指定格式字符串如果给定的主次关联关系中同一个告警关联多个主告警输出格式为[1001,(b,d,e)]表示告警b有多个主告警按字母序排序。如果给定的主次关联关系中存在环路输出格式为[1002,cycle]如果上述两种异常情况均不存在输出[1003,Verified]如果主次告警关系中同时存在1-2中多种情况输出检查码最小的结果用例1输入a b c b输出[1001,(b)]用例2输入a b b a输出[1002,cycle]说明主次关联关系为a-b-a,关系成环。题解思路拓扑排序这个题目可抽象为有向图具体告警理解为节点。[主告警 次告警]看作一条主告警 - 次告警的边。接下来就是考虑上述两种情况怎么在有向图中求解情况1同1个告警是否存在多个主告警, 这个可以通过拓扑排序的入度来解决如果一个节点的入度大于1说明存在情况1。记录下所有入度 1告警然后升序排序按照题目要求输出即可。情况2输入的主次关联关系中是否存在环路。 这是利用拓扑排序的特性来处理如果是有向无环图拓扑排序是可以全部处理全部节点。如果处理节点数量 实际节点数则说明存在环(存在环的部分有节点入度拓扑排序过程中不会变为0)按照1 2 的分析实现代码即可具体代码逻辑参照下面代码。c#include bits/stdc.h using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); unordered_mapstring, int id; // 告警名 - id vectorstring name; // id - 告警名 vectorvectorint graph; // 邻接表 vectorint indegree; // 入度 string parent, child; // 读取直到 EOF while (cin parent child) { // 分配id if (!id.count(parent)) { int newId id.size(); id[parent] newId; name.push_back(parent); graph.push_back({}); indegree.push_back(0); } if (!id.count(child)) { int newId id.size(); id[child] newId; name.push_back(child); graph.push_back({}); indegree.push_back(0); } int u id[parent]; int v id[child]; graph[u].push_back(v); indegree[v]; } int n id.size(); // 情况1同一个告警有多个主告警 vectorstring multiParent; for (int i 0; i n; i) { // 入度大于1说明关联多个 if (indegree[i] 1) { multiParent.push_back(name[i]); } } // 直接输出 if (!multiParent.empty()) { sort(multiParent.begin(), multiParent.end()); cout [1001,(; for (size_t i 0; i multiParent.size(); i) { cout multiParent[i]; if (i ! multiParent.size() - 1) cout ,; } cout )]; return 0; } // 情况2检测环拓扑排序 处理总结点 实际节点数说明存在环(成环节点的数量入度不会变为0) queueint q; vectorint indeg indegree; for (int i 0; i n; i) { if (indeg[i] 0) { q.push(i); } } int count 0; while (!q.empty()) { int u q.front(); q.pop(); count; for (int v : graph[u]) { indeg[v]--; if (indeg[v] 0) { q.push(v); } } } if (count n) { cout [1002,cycle]; return 0; } // 正常 cout [1003,Verified]; return 0; }