题目描述
给出N个节点,每个节点的信息包含该节点执行时间、下一个节点列表,求神经网络的最短执行时间。
假设深度学习模型是一个有向无环图。若算子A依赖算子B的输出,则当B执行完后才能计算A,如果没有依赖关系,则可并行执行,
计算每个网络所需要的最短时间。注意(算子索引从0开始)
有向无环图求拓扑排序。
示例
输入
7 A 10 1 2 3 B 9 3 4 5 C 22 4 5 D 20 E 19 F 18 6 G 21
输出
71
A->C->F->G
其实是 最长路径 问题
- 从A出发,找其前序节点,发现无前序节点,记录A的前序节点为空,当前最大路径为10,记录 Array[A]=10从B出发,找前序节点,找到A,前序节点只有A,记录前序节点为A,当前最大路径为9+Array[A] = 19,记录Array[B] = 19从C出发,找前序节点,找到A,同理,记录Array[C]=22+Array[A]=32从D出发,找到前序节点,找到了前序节点A和B,Array[A]=10,Array[B]=19所以选最大的,选择前序节点B。从E出发,找到前序节点是B或者C,Array[B]从F出发,同理找到前序节点,并选择C,得到 18+32=50从G出发,前序节点是F,得到21+50=71
代码:
#includeusing namespace std; void FindFront(int* nodes, int rows, int cols, int* fronts,int aim) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (nodes[i*rows+j]==aim) { fronts[i] = 1; } else if (nodes[i * rows + j] == -1) { break; } } } } struct nodeInfo { int index; int sum; }; int MinActingTime(int* nodes, int rows, int cols) { if (nodes==nullptr||rows<=0||cols<=0) { return 0; // 处理异常情况 } nodeInfo* maxArray = new nodeInfo[rows]; for (int i = 0; i < rows; i++) { maxArray[i].index = -1; maxArray[i].sum = -1; } //初始化矩阵 int maxSumAll = 0; int* fronts = new int[rows]; //建立一个front表,用于保存当前遍历节点的前序节点 for (int i = 0; i < rows; i++) { for (int j = 0; j < rows; j++) { fronts[j] = 0; } //遍历一个节点前, 初始化front表数据 FindFront(nodes, rows, cols, fronts, i); int maxFrontSum = -1; int maxFrontIndex = -1; for (int j = 0; j < rows; j++) { if (fronts[j]==1&&(maxArray[j].sum>maxFrontSum)) { // 找到了前序节点,而且前序节点值比之前找到的前序节点还大,进行替换 maxFrontSum = maxArray[j].sum; maxFrontIndex = j; } } if (maxFrontIndex==-1) { // 无前继节点的节点,最大值就是它自己 maxArray[i].index = -1; maxArray[i].sum = nodes[i * rows]; maxSumAll = maxArray[i].sum; } else { maxArray[i].index = maxFrontIndex; maxArray[i].sum = maxFrontSum + nodes[i * rows]; if (maxSumAll 原题目描述地址:神经网络的最短执行时间



