Vijos p1518 河流 转二叉树左儿子又兄弟
左儿子又兄弟的转发一定要掌握啊,竞赛必用,主要是降低编程复杂度,省时间。个人觉得状压DP也是为了降低编程复杂度。
方程就不说了,程序应该能看得懂,用的记忆化搜索,方便理解。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool p[];
int N,K,point[],next[],v[],c[],w[],cnt=;
int f[][][],l[],r[],dist[];
void insect(int x,int y,int z)
{next[cnt]=point[x];point[x]=cnt;v[cnt]=y;c[cnt]=z;cnt++;}
void dfs(int x)
{
int i,j;
for (i=point[x];i!=-;i=next[i])
if (p[v[i]]==)
{
if (l[x]==) l[x]=v[i],dist[v[i]]=dist[x]+c[i]; else
{
j=l[x];
while (r[j]!=) j=r[j];
r[j]=v[i]; dist[v[i]]=dist[x]+c[i];
}p[v[i]]=;
}
i=l[x]; while (i!=){dfs(i);i=r[i];}
}
int dp(int x,int fa,int k)
{
if (x==) return ;
if (f[x][fa][k]!=-) return f[x][fa][k];
if (k==) {
int now=(dist[x]-dist[fa])*w[x];
if (l[x]!=) now+=dp(l[x],fa,k);
if (r[x]!=) now+=dp(r[x],fa,k);
f[x][fa][k]=now; return now;
}
int i;f[x][fa][k]=;
for (i=;i<=k;++i)
f[x][fa][k]=min(f[x][fa][k],dp(l[x],fa,i)+dp(r[x],fa,k-i)+w[x]*(dist[x]-dist[fa]));
for (i=;i<k;++i)
f[x][fa][k]=min(f[x][fa][k],dp(l[x],x,i)+dp(r[x],fa,k--i));
return f[x][fa][k];
}
int main()
{
memset(point,-,sizeof(point));
memset(next,-,sizeof(next));
memset(dist,,sizeof(dist));
memset(v,-,sizeof(v));
memset(f,-,sizeof(f));
memset(c,,sizeof(c));
memset(w,,sizeof(w));
memset(l,,sizeof(l));
memset(r,,sizeof(r));
memset(p,,sizeof(p));
scanf("%d %d\n",&N,&K);
int i,di,vi;
for (i=;i<=N;++i)
{
scanf("%d %d %d\n",&w[i],&vi,&di);
insect(i,vi,di);insect(vi,i,di);
}p[]=;dfs();
printf("%d\n",dp(l[],,K));
return ;
}
Vijos p1518 河流 转二叉树左儿子又兄弟的更多相关文章
- UVa 11732 "strcmp()" Anyone? (左儿子右兄弟前缀树Trie)
题意:给定strcmp函数,输入n个字符串,让你用给定的strcmp函数判断字符比较了多少次. 析:题意不理解的可以阅读原题https://uva.onlinejudge.org/index.php? ...
- 左儿子右兄弟Trie UVA 11732 strcmp() Anyone?
题目地址: option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2832&qu ...
- Vijos p1518河流 树形DP
https://vijos.org/p/1518 这题代码我基本是抄的,实在太难想了.但是也学到了一些东西. 比如:多叉树转二叉树存,这个细细一想,确实使得在dfs的时候,实现起来方便很多. 说一说具 ...
- UVA11732 "strcmp()" Anyone?【左儿子右兄弟Trie】
LINK1 LINK2 题目大意 给你一些字符串,并定义了一个函数(具体见题面) 问你把任意两个字符串放到函数里面得到的值的和是多少 思路 该怎么统计答案呢? 每次考虑当前插入的串和所有已经插入过的串 ...
- UVALive - 3942 左儿子trie DP
题意:白书P209 本题用普通字典树会更快,为了练习还是尝试再敲一遍左儿子-右兄弟字典树(其实就是字典树上开前向星) dp[i]为满足[i...len)的分配方案数,转移方程为dp[i]=sum{dp ...
- UVa 11732 strcmp()函数(左孩子右兄弟表示法)
#include<iostream> #include<algorithm> #include<string> #include<cstring> #i ...
- DS二叉树--左叶子数量
题目描述 计算一颗二叉树包含的叶子结点数量. 左叶子是指它的左右孩子为空,而且它是父亲的左孩子 提示:可以用三叉链表法,也可以用现有算法对两层结点进行判断 建树方法采用“先序遍历+空树用0表示”的方法 ...
- 洛谷 P2014 选课 && caioj 1108 树形动态规划(TreeDP)3:选课
这里的先后关系可以看成节点和父亲的关系 在树里面,没有父亲肯定就没有节点 所以我们可以先修的看作父亲,后修的看作节点 所以这是一颗树 这题和上一道题比较相似 都是求树上最大点权和问题 但这道题是多叉树 ...
- 【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流
http://www.lydsy.com/JudgeOnline/problem.php?id=1065 https://vijos.org/p/1826 好难的题啊TWT ∈我这辈子也想不出来系列~ ...
随机推荐
- 用javascript得到客户端IP的新方法
javascript得到客户端IP的新方法 很久以来,我都是经过http://fw.qq.com/ipaddress来得到客户端用户的IP,这个方法简单.快速.实用 . 我们调用它的写法是: < ...
- 匈牙利算法 codevs 2776 寻找代表元
codevs 2776 寻找代表元 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 广州二中苏元实验学校一共有n个社团,分别用 ...
- codeforces 484B B. Maximum Value(二分)
题目链接: B. Maximum Value time limit per test 1 second memory limit per test 256 megabytes input standa ...
- UESTC 914 方老师的分身I Dijkstra
题意:求有向图的往返最短路的最长长度. 分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来.考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果. 所以 ...
- Google play billing(Google play 内支付) 上篇
写在前面: 最近Google貌似又被全面封杀了,幸好在此之前,把Google play billing弄完了,现在写篇 博客来做下记录.这篇博客一是自己做个记录,二是帮助其他有需要的人.因为现在基本登 ...
- uGUI练习(四) Light UI
练习目标 在我之前的文章 Unity 2D Sprite Lighting ,讲到在2D Sprite中可以使用灯光,非常高兴的是,在Unity的新UI系统中我们也可以使用灯光 步骤 1.创建一个Pa ...
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_acce
在tomcat/conf/server.xml里的<host>标签下加上 <Valve className="org.apache.catalina.valves.Acce ...
- this关键字的使用
一,表示类中属性 1,没有使用this的情况 class Person{ // 定义Person类 private String name ; // 姓名 private int age ; // 年 ...
- 28Spring_的事务管理_银行转账业务加上事务控制_基于注解进行声明式事务管理
将applicationContext.xml 和 AccountServiceImpl 给备份一个取名为applicationContext2.xml 和 AccountServiceImpl2.j ...
- usb驱动开发11之设备生命线
暂时先告别媒人,我们去分析各自的生命旅程,最后还会回到usb_device_match函数. 首先当你将usb设备连接在hub的某个端口上,hub检测到有设备连接了进来,它会为设备分配一个struct ...