关于该题理解有两个问题,求解
  • 板块P1113 杂务
  • 楼主wo488
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/21 17:06
  • 上次更新2024/10/21 19:39:23
查看原帖
关于该题理解有两个问题,求解
1198506
wo488楼主2024/10/21 17:06

求最短时间

ans = max(ans, dfs(i));
f[x] = max(f[x], dfs(a[x][i]));

这里为什么是最大值

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

// 定义最大任务数量
const int N = 10010;
// f[N]数组用于存储以每个任务为根节点的子树中完成所有任务所需的最长时间
int f[N];
// time1[N]数组存储每个任务本身所需的时间
int time1[N];
// a[N]是一个向量数组,其中a[i]存储了任务i的所有后续任务的编号,表示任务之间的依赖关系
vector<int> a[N];

// 深度优先搜索函数,用于计算以任务x为根节点的子树中完成所有任务所需的最长时间
int dfs(int x) {
    // 如果该节点已经遍历过了,直接返回已计算出的最长时间,进行剪枝操作
    if (f[x]) return f[x];
    for (int i = 0; i < a[x].size(); i++) {
        // 递归计算任务x的每个后续任务为根节点的子树的最长时间,并更新f[x]为所有后续任务中最长时间的最大值
        f[x] = max(f[x], dfs(a[x][i]));
    }
    // 加上任务x本身所需的时间
    f[x] += time1[x];
    return f[x];
}

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int x, y, z;
        cin >> x >> y >> z;
        // 存储任务x本身所需的时间
        time1[x] = y;
        while (z!= 0) {
            // 表示只有完成任务z后才能完成任务x,将任务x加入任务z的后续任务列表
            a[z].push_back(x);
            scanf("%d", &z);
        }
    }

    int ans = 0;
    for (int i = 1; i <= n; i++) {
        // 对每个任务调用dfs函数,计算以该任务为根节点的子树的最长时间,并更新ans为所有任务中的最长时间
        ans = max(ans, dfs(i));
    }
    cout << ans << endl;
    return 0;
}
2024/10/21 17:06
加载中...