反向图 + dfs
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
const int N = 110;
int n, m;
vector<int> p(N);
vector<int> t(N);
vector<vector<int>> graph(N);
vector<int> earliest(N, -1);
vector<int> latest(N, -1);
int get_earliest(int i) {
if (earliest[i] != -1) return earliest[i];
if (p[i] == 0) return earliest[i] = 1;
return earliest[i] = get_earliest(p[i]) + t[p[i]];
}
int get_latest(int i) {
if (latest[i] != -1) return latest[i];
int max_chain{0};
for (int j : graph[i]) {
max_chain = max(max_chain, get_latest(j) + t[j]);
}
return latest[i] = max_chain;
}
int main(int argc, char *argv[]) {
cin >> n >> m;
for (int i = 1; i <= m; i++) cin >> p[i];
for (int i = 1; i <= m; i++) cin >> t[i];
for (int i = 1; i <= m; i++) {
if (p[i]) graph[p[i]].push_back(i); // project i rely on project p[i]
}
bool can_finish{true};
for (int i = 1; i <= m; i++) {
int start_time = get_earliest(i);
cout << start_time << " ";
if (can_finish && start_time + t[i] - 1 > n) can_finish = false;
}
if (can_finish) {
cout << endl;
for (int i = 1; i <= m; i++) {
cout << n - get_latest(i) - t[i] + 1 << " ";
}
cout << endl;
}
return 0;
}