09 2013 档案

摘要:题目是问把一棵树通过剪边、加边形成一个环的最小代价。分成两步,先把树剪成一些链,再把链连接成一个环。设一棵有n个节点的树,剪掉X条边后,形成L条链。那么代价为X+L。n-1-X=edgeNum(L条链) ① //原本有n-1条边,剪掉X条,还剩edgeNum(L条链)条edgeNum(L条链)+L=n ② //L条链的这些边+L条边形成一个有n条边的环由①、②得到,L=X+1则代价为 X+L=2*L-1=2*X+1。问题转化成了,把一棵树剪成一些链,最少能剪成几条链?或者,最少需要剪掉多少条边?我觉得到了这一步问题就好解决了,我是树形dp搞的,求的是最少能剪成几条链。dp[u][0]表示u节点 阅读全文
posted @ 2013-09-09 21:55 kiwi_bird 阅读(306) 评论(4) 推荐(1)
摘要:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs。反例:5 41 2 22 3 12 4 -1004 5 10写树形dp的时候,WA了好多次,错误在于:记录单链的时候,一个节点的最长单链不一定等于:边权+孩子的最长单链还可以不选孩子,只要边权就行!!!!!!如果边权非负的话,就是 边权+孩子的最长单链 了。思路: dp[u][0],记录的是以u为根结点的子树中的最长路 dp[u][1],记录的是以u为起点的向下的一条最长链转移时: a记录的是max{ dp[sons... 阅读全文
posted @ 2013-09-01 14:15 kiwi_bird 阅读(472) 评论(0) 推荐(0)