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

相关推荐

不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
7
分享
牛客网
牛客企业服务