左儿子又兄弟的转发一定要掌握啊,竞赛必用,主要是降低编程复杂度,省时间。个人觉得状压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 河流 转二叉树左儿子又兄弟的更多相关文章

  1. UVa 11732 "strcmp()" Anyone? (左儿子右兄弟前缀树Trie)

    题意:给定strcmp函数,输入n个字符串,让你用给定的strcmp函数判断字符比较了多少次. 析:题意不理解的可以阅读原题https://uva.onlinejudge.org/index.php? ...

  2. 左儿子右兄弟Trie UVA 11732 strcmp() Anyone?

    题目地址: option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2832&qu ...

  3. Vijos p1518河流 树形DP

    https://vijos.org/p/1518 这题代码我基本是抄的,实在太难想了.但是也学到了一些东西. 比如:多叉树转二叉树存,这个细细一想,确实使得在dfs的时候,实现起来方便很多. 说一说具 ...

  4. UVA11732 "strcmp()" Anyone?【左儿子右兄弟Trie】

    LINK1 LINK2 题目大意 给你一些字符串,并定义了一个函数(具体见题面) 问你把任意两个字符串放到函数里面得到的值的和是多少 思路 该怎么统计答案呢? 每次考虑当前插入的串和所有已经插入过的串 ...

  5. UVALive - 3942 左儿子trie DP

    题意:白书P209 本题用普通字典树会更快,为了练习还是尝试再敲一遍左儿子-右兄弟字典树(其实就是字典树上开前向星) dp[i]为满足[i...len)的分配方案数,转移方程为dp[i]=sum{dp ...

  6. UVa 11732 strcmp()函数(左孩子右兄弟表示法)

    #include<iostream> #include<algorithm> #include<string> #include<cstring> #i ...

  7. DS二叉树--左叶子数量

    题目描述 计算一颗二叉树包含的叶子结点数量. 左叶子是指它的左右孩子为空,而且它是父亲的左孩子 提示:可以用三叉链表法,也可以用现有算法对两层结点进行判断 建树方法采用“先序遍历+空树用0表示”的方法 ...

  8. 洛谷 P2014 选课 && caioj 1108 树形动态规划(TreeDP)3:选课

    这里的先后关系可以看成节点和父亲的关系 在树里面,没有父亲肯定就没有节点 所以我们可以先修的看作父亲,后修的看作节点 所以这是一颗树 这题和上一道题比较相似 都是求树上最大点权和问题 但这道题是多叉树 ...

  9. 【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流

    http://www.lydsy.com/JudgeOnline/problem.php?id=1065 https://vijos.org/p/1826 好难的题啊TWT ∈我这辈子也想不出来系列~ ...

随机推荐

  1. Redis漏洞?阿里云被攻击!

    今天运维那边过来说阿里云服务器进程被占用很多,后来查了一下进程发现了这个玩意: 小编我看不懂,经运维先森仔细研究,发现这是被注入进来的一个进程,服务器被当成了肉鸡,专门用来跑比特币的,这样对方就不需要 ...

  2. 用Access作为后台数据库支撑,书写一个用C#写入记录的案例

    具体的步骤: 1.创建并打开一个OleDbConnection对象 2.创建插入的SQL语句 3.创建一个OleDbCommand对象 4.使用OleDbCommand对象来插入数据 5.关闭OleD ...

  3. Volley(四)—— ImageLoader & NetworkImageView

    Volley(四)—— ImageLoader & NetworkImageView ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码 ...

  4. smarty初始化文件

    为了smarty初始化文件能方便其他目录下的脚步包含使用,应该将初始化文件里的引入smarty类及其他路径设置为全局路径,而不是相对路径 另外,如果模板里有文件的路径的引用,一定要是相对PHP脚本文件 ...

  5. Python进阶-面向对象

    类的成员 类的成员可以分为三类:字段.方法.属性 一:字段: 普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同 普通字段属于对象 静态字段属于类 字段的定义和使用 ...

  6. 对比git rm和rm的使用区别

    在这里说一下git rm和rm的区别,虽然觉得这个问题有点肤浅,但对于刚接触git不久的朋友来说还是有必要的. 用 git rm 来删除文件,同时还会将这个删除操作记录下来:用 rm 来删除文件,仅仅 ...

  7. oracle用sqlplus创建新用户,不是plsql developer

    1.sqlplus /nolog 2.conn /as sysdba 3.alter user system identified by "123456"; 4.alter use ...

  8. ASP.NET MVC3 Model验证总结(转)

    推荐:   ASP.NET MVC的Model元数据与Model模板:预定义模板 http://www.cnblogs.com/artech/archive/2012/05/02/model-meta ...

  9. Nginx+UWSGI+Django配置全过程

    重度参阅 原理+实战http://zhou123.blog.51cto.com/4355617/1688434 原理http://www.cnblogs.com/fnng/p/5268633.html ...

  10. C# 与 Unity 同名函数

    1,Random,直接使用Random会报错,要么使用UnityEngine.Random,要么使用System.Random