2021vivo提前批笔试,第三题求教

第三题:最短路径
图像从传感器到输出JPEG格式图片经过很多node处理,这些node构成一个图像处理的pipeline,其中的有些节点依赖于其他节点输出。A->B表示B的执行依赖于A。
假设每个node执行时间为A(t),即node A需要执行t秒,没有依赖的node可以并行执行。编写一个方法输入一个有向无环图pipeline,输出执行完需要的最短时间。
输入:第一行输入node的执行时间,第二行输入node的依赖关系。
输出:最短时间。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

const int N = 100010;
int e[N], ne[N], h[N], w[N], idx;

// 拉链法建图
void add(int a, int b){
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}

// dfs深搜
int dfs(int u){
    int s = 0;
    //遍历u结点的所有儿子
    for(int i = h[u]; ~i; i = ne[i]){
        int j = e[i];
        s = max(s, dfs(j)); // 递归求所有儿子中值最大的那个
    }
    return s + w[u]; // 返回儿子最大值+本身的消耗
}

int main(){
    memset(h, -1, sizeof h);
    int num, k = 0;
    
    // 写入结点权重
    while(cin >> num){
        w[++ k] = num;
        if(cin.get() == '\n') break;
    }
    
    vector<bool> st(k); // 记录该节点是否有父结点
    k = 1;
    while(cin >> num){
        add(k, num);
        st[num] = true;
        char op = cin.get();
        if(op == ';') k++;
        else if(op == '\n') break;
    }

    // dfs,从每个根节点往下递归
    int ans = 0;
    for(int i = 1; i <= st.size(); i++){
        if(st[i] == false)
            ans += dfs(i);
    }
    
    cout << ans;
    
    return 0;
}
我的思路是这样的:从每个根节点递归往下搜,找到每个结点所有儿子中消耗最大的值,将最大值+该结点的消耗作为返回值,这样就能知道根节点的消耗了。不知道哪里有问题,只过了70%的样例。有无大佬指点一波。

#笔经##vivo##笔试题目#
全部评论
应该是每个节点找它所有前驱节点的最大值 或者你一开始就把边反着连
2 回复 分享
发布于 2021-06-19 14:13
第一题不知道为啥只能过30%
点赞 回复 分享
发布于 2021-06-20 14:29
甘帝么
点赞 回复 分享
发布于 2021-06-20 21:37
我的理解是拓扑排序求最长路径,不知道理解的对不对==
点赞 回复 分享
发布于 2021-06-20 23:36

相关推荐

伟大的烤冷面被普调:暨大✌🏻就是强
点赞 评论 收藏
分享
牛客533433175号:更可气的是我做完这些给我拒了
点赞 评论 收藏
分享
评论
点赞
7
分享
牛客网
牛客企业服务