题目大意:给出一棵带权树,规定 ,解释一下就是当确定三个点 u1 , u2 , u3 后,需要找到一个点 v 到三个点的距离之和最小,现在给出 u1 , u2 , u3 的可行取值,问 f 函数的期望是多少

题目分析:考虑转换模型,对于给定的 u1 , u2 和 u3 来说,不难猜出点 v 是唯一存在的(不会证明),相应的这个最短的距离之和也是唯一确定的,且可以表示为 

这样一来根据两个期望的基本公式进行转换:

  1. E( X + Y ) = E( X ) + E( Y )
  2. E( CX ) = CE( X )

如此一来就将 u1 , u2 , u3 的贡献拆成了分别独立的三组,再考虑对于 E( dis( u , v ) ) 该如何去求

现在问题就是如何快速求出 E( dis( u1 , u2 ) ) 了

接下来一个思维点就是,需要想到计算每条边的贡献,具体就是,对于一条边 ( u , v ) 来说,当移除掉这条边后,整棵树将会被分成不连通的两个部分,记为 T1 和 T2,比较显然的是:

  1. T1 中的 u1 到 T2 中的 u2 必然会经过当前边
  2. T1 中的 u2 到 T2 中的 u1 必然会经过当前边

直接树形 dp 就好了

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;vector<pair<int,int>>node[N];LL sz[4][N],cnt[4];double ans=0;void dfs1(int u,int fa)
{for(auto it:node[u]){int v=it.first;if(v==fa)continue;dfs1(v,u);for(int i=1;i<=3;i++)sz[i][u]+=sz[i][v];}
}void dfs2(int u,int fa)
{for(auto it:node[u]){int v=it.first,w=it.second;if(v==fa)continue;dfs2(v,u);for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)if(i!=j)ans+=1.0*(sz[i][1]-sz[i][v])*sz[j][v]*w/cnt[i]/cnt[j]/2;}
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n;scanf("%d",&n);for(int i=1;i<n;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);node[u].emplace_back(v,w);node[v].emplace_back(u,w);}for(int i=1;i<=3;i++){scanf("%d",cnt+i);for(int j=1;j<=cnt[i];j++){int x;scanf("%d",&x);sz[i][x]++;}}dfs1(1,-1);dfs2(1,-1);printf("%.10f\n",ans);return 0;
}

2020CCPC(威海) - Rencontre(树形dp)相关推荐

  1. 2020CCPC(秦皇岛) - Kingdom‘s Power(树形dp+贪心)

    题目大意:给出一棵 n 个节点的有根树,点 1 为根节点,现在在根节点有无穷多个士兵,每一秒可以控制任意一个士兵向任意一个单位移动一步,士兵移动到的点会被永久占领,现在问最少需要经过多少秒,才能将所有 ...

  2. 2020CCPC威海

    2020CCPC威海 2020CCPC威海榜单 题号 题目 知识点 难度 A Golden Spirit 思维,推导题 签到题 B Labyrinth dfs+思维 金牌题 C Rencontre D ...

  3. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  4. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  5. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  6. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  7. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  8. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  9. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

最新文章

  1. ROS话题通信中创建自定义数据类型的两种方式
  2. 计算机网络管理的常用命令,网络管理常用命令图文详解.pdf
  3. 【原创】CSSOO的思想及CSS框架的应用(未整理完)
  4. 寻找免费的阿里云云盾隐秘购买入口,申请并下载ssl证书(https证书)的详细步骤
  5. hust1347(归并排序求逆序对)
  6. flink批流统一​(还没完成)
  7. C++ 实现排序问题:时间复杂度O(n),空间复杂度O(1)
  8. 【岗位详情】腾讯广告策略产品经理(北京)
  9. c ++中字符串长度的_C ++中的字符串长度
  10. Google全球副总裁Vint Cerf:中国物联网发展不得不关注的几大问题
  11. shared_ptr实现copy_on_write
  12. java带界面的代码_求一个java swing带界面的万年历代码
  13. 油田大数据与创新之路的探究
  14. 微博营销的优劣势。如何利用微博开展营销。
  15. 漫谈程序员系列:别说“我已经很努力了”
  16. pta:人民币与美元汇率兑换程序(python)
  17. 交付管理——怎样与客户打交道
  18. 图像处理基础和OpenCV常用接口
  19. JS生成浏览器唯一标识解决方案
  20. 360全景拍摄有哪些技巧?

热门文章

  1. mysql 字符串分区_Mysql分区表的原理和优缺点
  2. c语言中二维数组怎么,c语言中什么是二维数组
  3. SpringAMQP--FanoutExchange
  4. Nginx的rewrite之break指令
  5. SpringBoot-@Configuration
  6. JdbcTemplate和NamedParameterJdbcTemplate
  7. 使用Ehcache+Redis实现分布式缓存
  8. SpringBoot编写HelloWorld-new
  9. LocalDateTime - Java处理日期和时间
  10. FastDFS:Java客户都实现文件的上传、下载、修改、删除