6
2025-08-16 17:27:15
发布于:浙江
8阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
const int MAXM = 1005;
const int MAXW = 1005;
vector<int> get_path(int u, vector<int>& parent) {
vector<int> path;
while(u != 1) {
path.push_back(u);
u = parent[u];
}
path.push_back(1);
return path;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, W;
cin >> n >> m >> W;
vector<int> parent(n+1);
for(int i=2; i<=n; ++i)
cin >> parent[i];
vector<tuple<int,int,int>> jobs;
for(int i=0; i<m; ++i) {
int u, w, v;
cin >> u >> w >> v;
jobs.emplace_back(u, w, v);
}
vector<vector<int>> dp(m+1, vector<int>(W+1));
for(int i=1; i<=m; ++i) {
auto [u, w, v] = jobs[i-1];
auto path = get_path(u, parent);
int cost = 2*(path.size()-1) + w;
for(int j=0; j<=W; ++j) {
dp[i][j] = dp[i-1][j];
if(j >= cost)
dp[i][j] = max(dp[i][j], dp[i-1][j-cost] + v);
}
}
cout << dp[m][W];
return 0;
}
这里空空如也
有帮助,赞一个