摘要: 树形dp;思想: 把正向边赋值为0;反向边赋值为1;然后求出点到其他点的最小距离;两次dfs:第一次是从下往上:记录每个点到所有子树中需要改变的边的条数;第二次是自上往下:由父节点求子节点到所有点的需要改变的边的条数。代码: 1 #include 2 #include 3 #include 4 #define maxn 200005 5 using namespace std; 6 7 struct node 8 { 9 int v,w;10 };11 12 vectorve[maxn];13 int dp[maxn],res;14 bool vis[maxn];15 16 void... 阅读全文
posted @ 2013-09-17 17:21 Yours1103 阅读(531) 评论(0) 推荐(0) 编辑
摘要: 树形dp题,要求求出书上的最远距离;很经典的一种树形dp;思路:最远距离要么是从老爸的最远距离+自己与老爸的距离; 要么是儿子的最远距离+自己与儿子的距离;然后比较上面两个的大小就是答案了!参考了别人的代码:两次搜索:1.第一次搜索是从下至上的搜索,找到每个节点的最远距离f[],次远距离sf[];并记录最远距离的那个点;2.第二次搜索是从上往下的搜索,找到老爸那边来的最远距离dp[];代码: 1 #include 2 #include 3 #include 4 #define maxn 10005 5 using namespace std; 6 7 struct node 8... 阅读全文
posted @ 2013-09-17 16:11 Yours1103 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 树形dp的基础题;状态转移很简单:老爸没选,儿子可选可不选,最大就行;老爸选了,儿子肯定不能选;dp[root][0]+=max(dp[son][1],dp[son][0]); dp[root][1]+=dp[son][0];代码: 1 #include 2 #include 3 #include 4 #define maxn 6003 5 using namespace std; 6 7 int w[maxn],dp[maxn][2]; 8 vectorve[maxn]; 9 bool vis[maxn];10 11 void dfs(int a)12 {13 vis... 阅读全文
posted @ 2013-09-17 09:09 Yours1103 阅读(196) 评论(0) 推荐(0) 编辑