P3354 [IOI2005] Riv 河流 (树形 dp)
树形 dp
我们很容易套路地用
所以我们现在考虑增加状态,能够表示出距离。只考虑
但是仔细一想还是不够,如果
转移时细节的地方:我们在转移时可以先钦定
复杂度
#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define fi first
#define se second
#define pb push_back
typedef long long i64;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 110;
int n, k, cnt;
struct node {
int to, nxt, w;
} e[N];
int h[N], w[N];
void add(int u, int v, int w) {
e[++cnt].to = v;
e[cnt].nxt = h[u];
e[cnt].w = w;
h[u] = cnt;
}
int st[N], top;
int f[N][N][N], g[N][N][N], dis[N];
void dfs(int u) {
st[++top] = u;
for(int _ = h[u]; _; _ = e[_].nxt) {
int v = e[_].to;
dis[v] = dis[u] + e[_].w;
dfs(v);
for(int i = 1; i <= top; i++) {
for(int j = k; j >= 0; j--) {
f[u][st[i]][j] += f[v][st[i]][0];
g[u][st[i]][j] += f[v][u][0]; //这里要先转移一次,否则无法正确转移
for(int x = 1; x <= j; x++) {
f[u][st[i]][j] = std::min(f[u][st[i]][j], f[u][st[i]][j - x] + f[v][st[i]][x]);
g[u][st[i]][j] = std::min(g[u][st[i]][j], g[u][st[i]][j - x] + f[v][u][x]);
}
}
}
}
for(int i = 1; i <= top; i++) {
for(int j = k; j >= 1; j--) {
f[u][st[i]][j] = std::min(f[u][st[i]][j] + w[u] * (dis[u] - dis[st[i]]), g[u][st[i]][j - 1]);
}
f[u][st[i]][0] += w[u] * (dis[u] - dis[st[i]]);
}
top--;
}
void Solve() {
std::cin >> n >> k;
for(int i = 1; i <= n; i++) {
int v, d;
std::cin >> w[i] >> v >> d;
add(v, i, d);
}
dfs(0);
std::cout << f[0][0][k] << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
Solve();
return 0;
}
标签:
DP
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具