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%的样例。有无大佬指点一波。
查看15道真题和解析