You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++调试与运行结果不一致问题求助(DAG最短执行时间算法)

问题描述

给定一个表示深度学习模型的有向无环图(DAG):若算子A依赖算子B的输出,则A需在B执行后计算;无依赖的算子可并行执行。求该神经网络的最短执行时间(节点索引从0开始)。

输入示例:

7
A 10 1 2 3
B 9 4 5 6
C 22
D 20
E 19
F 18
G 21
问题现象

编写的C++代码在调试模式下能得到正确输出40,但运行模式下结果错误。已排查指针未分配、变量未初始化等常见问题,仍未找到原因。

代码问题分析与修复

1. 输入读取逻辑错误

原代码读取每行输入的逻辑存在致命问题:

while (cin >> s){
    stemp.push_back(s);
    if (getchar() == '\n') break;
}

cin >> s会自动跳过所有空白字符(包括空格、换行),执行getchar()时,读取的是cin之后的第一个字符,大概率是空格而非换行,导致提前终止读取,后续数据未被正确存入stemp,最终NN中的数据完全错误。

修复方式:改为按行读取整行,再拆分每行内容:

string line;
// 先读取n后的换行符,避免干扰后续行读取
cin.ignore();
for (int i = 0; i < n; ++i) {
    getline(cin, line);
    stringstream ss(line);
    stemp.clear();
    temp.clear();
    string token;
    while (ss >> token) {
        stemp.push_back(token);
    }
    // 转换为时间和后续节点
    for (int j = 1; j < stemp.size(); ++j) {
        temp.push_back(stoi(stemp[j]));
    }
    NN.push_back(temp);
}

同时,冗余的str_int函数可直接用标准库stoi替代,无需手动复制字符串到char数组。

2. DFS核心逻辑错误

  • 终止条件判断错误:原代码用NN[node][1] != 0判断节点是否有后续节点,会触发两个问题:一是当节点无后续节点时,NN[node].size() == 1,访问NN[node][1]会触发数组越界,产生未定义行为;二是若后续节点索引为0,会误判为无后续节点。正确判断方式是检查NN[node].size() > 1(即存在后续节点)。
  • 终止分支取值错误:原代码在终止分支中取node(节点索引)而非节点的执行时间NN[node][0],导致计算逻辑完全错误。

修复后的DFS函数:

int dfs(int nodeTime, const vector<int>& nextNodes, const vector<vector<int>>& NN){
    int maxTime = 0;
    // 遍历所有后续节点,计算每个节点的最长路径时间
    for (int nodeIdx : nextNodes) {
        const auto& nodeData = NN[nodeIdx];
        int currentNodeTime = nodeData[0];
        if (nodeData.size() > 1) {
            // 该节点有后续节点,递归计算
            vector<int> next(nodeData.begin() + 1, nodeData.end());
            maxTime = max(maxTime, dfs(currentNodeTime, next, NN));
        } else {
            // 该节点无后续节点,直接取其执行时间
            maxTime = max(maxTime, currentNodeTime);
        }
    }
    // 当前节点时间加上后续节点的最长路径时间
    return nodeTime + maxTime;
}

同时将NN参数改为const vector<vector<int>>&,避免不必要的拷贝,提升效率。

修正后的完整代码
#include <bits/stdc++.h>
using namespace std;

int dfs(int nodeTime, const vector<int>& nextNodes, const vector<vector<int>>& NN){
    int maxTime = 0;
    for (int nodeIdx : nextNodes) {
        const auto& nodeData = NN[nodeIdx];
        int currentNodeTime = nodeData[0];
        if (nodeData.size() > 1) {
            vector<int> next(nodeData.begin() + 1, nodeData.end());
            maxTime = max(maxTime, dfs(currentNodeTime, next, NN));
        } else {
            maxTime = max(maxTime, currentNodeTime);
        }
    }
    return nodeTime + maxTime;
}

int main() {
    int n;
    cin >> n;
    vector<vector<int>> NN;
    vector<int> temp;
    vector<string> stemp;
    // 忽略n后面的换行符
    cin.ignore();
    for (int i = 0; i < n; ++i) {
        string line;
        getline(cin, line);
        stringstream ss(line);
        stemp.clear();
        temp.clear();
        string token;
        while (ss >> token) {
            stemp.push_back(token);
        }
        for (int j = 1; j < stemp.size(); ++j) {
            temp.push_back(stoi(stemp[j]));
        }
        NN.push_back(temp);
    }

    vector<int> initialNextNodes;
    if (NN[0].size() > 1) {
        initialNextNodes.assign(NN[0].begin() + 1, NN[0].end());
    }
    int res = dfs(NN[0][0], initialNextNodes, NN);
    cout << res << endl;
    return 0;
}

验证结果

运行修正后的代码,输入示例数据,输出为40,符合预期。

内容的提问来源于stack exchange,提问作者S200331082

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:00:59