欢迎光临
我们一直在努力

华为OD机试真题2026双机位C卷 C++实现【主次关联成环警告】

华为OD机试真题:主次关联成环警告

2026华为OD机试双机位C卷 – 华为OD上机考试双机位C卷 200分题型

其它语言题解点击跳转:华为OD机试双机位C卷:主次关联成环警告(C/C++/Java/Python/Go/JS)

题目描述

在ICT运维领域,现网运维工程师面向对设备上报的众多告警,往往需要筛选出最主要的告警优先处理,次等级的告警或许为同一个根因导致的告警,处理优先级会放后或者不处理,这样就诞生出主次关联告警的概念。给定一系列告警的主次关联关系,判断是否存在如下情况:

  • 情况1:同1个告警是否存在多个主告警。
  • 情况2:输入的主次关联关系中是否存在环路。

输入描述

每个主次关联关系单独一行输入,输入形式为"主告警 次告警"。

例如

25aba 68vup

25aba为主告警,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_map<string, int> id; // 告警名 -> id
    vector<string> name; // id -> 告警名
    vector<vector<int>> graph; // 邻接表
    vector<int> 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:同一个告警有多个主告警
    vector<string> 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)
    queue<int> q;
    vector<int> 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;
    }

    赞(0)
    未经允许不得转载:171主机测评 » 华为OD机试真题2026双机位C卷 C++实现【主次关联成环警告】
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址