LA 4015 Cave
时间:2020-02-18
本文章向大家介绍LA 4015 Cave,主要包括LA 4015 Cave使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
树上dp
入度为零的点即没有父亲的点就是根节点
由于距离很大,不能加入到状态里,则考虑如何求出访问了 i (1 <= i <= n) 个点最小的距离
对与树的根节点而言,从它开始游历它的子树,要么在子树内结束,要么返回根节点
那么:
记 f[u][j] 表示从 u 出发访问其子树,访问了 j 个点,并且回到 u 的最小花费
记 g[u][j] 表示从 u 出发访问其子树,访问了 j 个点,最后停留在其子树内中的最小花费
讨论 u 的最终是否停留在子节点 v 的子树中,得到状态转移方程:
g[u][j] = min(g[u][j], min(f[u][j - k] + e[i].d + g[v][k], g[u][j - k] + 2*e[i].d + f[v][k]))
f[u][j] = min(f[u][j], f[v][k] + 2*e[i].d + f[u][j - k])
对于每一个x答案就是max(i) g[s][i] <= x // s == root
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int N = 505; 5 typedef long long LL; 6 7 int n, q, cnt, first[N], s, tot, siz[N]; 8 LL f[N][N], g[N][N], x; 9 bool vis[N]; 10 struct Edge { 11 int to, next; 12 LL d; 13 } e[N]; 14 15 void dfs(int u) { 16 f[u][1] = g[u][1] = 0; 17 siz[u] = 1; 18 for(int i = first[u]; i != -1; i = e[i].next) { 19 int v = e[i].to; 20 dfs(v); 21 siz[u] += siz[v]; 22 for(int j = siz[u]; j >= 2; j--) 23 for(int k = 1; k <= j && k <= siz[v]; k++) 24 g[u][j] = min(g[u][j], min(f[u][j - k] + e[i].d + g[v][k], g[u][j - k] + 2*e[i].d + f[v][k])); 25 for(int j = siz[u]; j >= 2; j--) 26 for(int k = 1; k <= j && k <= siz[v]; k++) 27 f[u][j] = min(f[u][j], f[v][k] + 2*e[i].d + f[u][j - k]); 28 } 29 return; 30 } 31 32 void add(int u, int v, int w) { 33 e[cnt] = (Edge) {v, first[u], w}; 34 first[u] = cnt++; 35 } 36 37 int main() { 38 while(cin>>n && n) { 39 memset(f, 0x7f, sizeof(f)); 40 memset(g, 0x7f, sizeof(g)); 41 memset(first, -1, sizeof(first)); 42 memset(vis, 0, sizeof(vis)); 43 memset(siz, 0, sizeof(siz)); 44 cnt = 0; 45 for(int u, v, w, i = 1; i < n; i++) { 46 cin>>u>>v>>w; 47 add(v, u, w); 48 vis[u] = 1; 49 } 50 for(int i = 0; i < n; i++) 51 if(!vis[i]) s = i; 52 dfs(s); 53 cin>>q; 54 cout<<"Case "<<++tot<<":"<<endl; 55 for(int i = 1; i <= q; i++) { 56 cin>>x; 57 for(int j = n; j; j--) 58 if(g[s][j] <= x) { 59 cout<<j<<endl; 60 break; 61 } 62 } 63 } 64 return 0; 65 }
原文地址:https://www.cnblogs.com/ympc2005/p/12326550.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [译]按功能(特性)分包
- Spring Boot Admin简介及实践
- Spring Boot Admin实现服务健康预警
- 除了FastJson,你也应该了解一下Jackson(二)
- 除了FastJson,你也应该了解一下Jackson(一)
- JavaScript性能优化总结
- Spring Boot2+Resilience4j实现容错之Bulkhead
- [译]高性能缓存库Caffeine介绍及实践
- 云原生时代高性能Java框架—Quarkus(一)
- 云原生时代高性能Java框架—Quarkus(二)
- 使用TypeScript积累自己的类库
- 在Egret项目中使用protobuf
- JavaScript原型与继承
- 当TKE遇上Coding, 业务如何实现快速迭
- cocos creator 1.x透明渐变效果实现