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
相关产品推荐
相关产品推荐

