题目大意:给定一棵带边权树,给三份点的集合U1,U2,U3,求0.5*(E(dis(u1,u2))+E(dis(u1,u3))+E(dis(u2,u3))).

即,我们需要维护两份点的所有距离和。显然,如果用lca处理会超时,于是我们考虑使用树形dp进行处理。对每条边,我们考虑删除它的代价为它所链接的两个连通分量的不同颜色的数量的积乘以该边权。那么直接用树形dp维护即可。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read(){
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int maxn=(2e5)+5;
struct node{
int to,w;
};
bool che[4][maxn];
ll cnt[3];
vector<node>g[maxn];
ll siz[4][maxn];
bool vis1[maxn];
void dfs1(int u){
vis1[u]=1;
for(int i=1;i<=3;i++){
if(che[i][u])siz[i][u]=1;
}
for(int i=0;i<g[u].size();i++){
int v=g[u][i].to;
if(!vis1[v]){
dfs1(v);
for(int j=1;j<=3;j++)siz[j][u]+=siz[j][v];
}
}
}
bool vis2[maxn];
double ans=0;
void dfs2(int u){
vis2[u]=1;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].to;
int w=g[u][i].w;
if(!vis2[v]){
dfs2(v);
for(int j=1;j<=3;j++){
for(int k=1;k<=3;k++){
if(j!=k)ans+=1.0*siz[j][v]*(cnt[k]-siz[k][v])*w/(cnt[k]*cnt[j]*1.0);
}
}
}
}
}
int main(){
int n=read();
for(int i=1;i<n;i++){
int u=read();
int v=read();
int w=read();
g[u].push_back(node{v,w});
g[v].push_back(node{u,w});
}
for(int i=1;i<=3;i++){
ll m=read();
cnt[i]=m;
for(int j=1;j<=m;j++){
ll x=read();
che[i][x]=1;
}
}
dfs1(1);
dfs2(1);
printf("%.11lf\n",ans/2.0);
return 0;
}

2020ccpc威海C.Rencontre题解(树形dp)的更多相关文章

  1. Codeforces Round #384 (Div. 2)D - Chloe and pleasant prizes 树形dp

    D - Chloe and pleasant prizes 链接 http://codeforces.com/contest/743/problem/D 题面 Generous sponsors of ...

  2. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  3. BNUOJ 52305 Around the World 树形dp

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

  4. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  5. 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

  6. 【bzoj1304】[CQOI2009]叶子的染色 树形dp

    题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...

  7. 【bzoj1596】[Usaco2008 Jan]电话网络 树形dp

    题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...

  8. 【bzoj2591】[Usaco 2012 Feb]Nearby Cows 树形dp

    题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into accoun ...

  9. 【bzoj1131】[POI2008]Sta 树形dp

    题目描述 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. 输出 输出你所找到的点,如果具有 ...

  10. 【bzoj1369】[Baltic2003]Gem 树形dp

    题目描述 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小. 输入 先给出一个数字N,代表树上有N ...

随机推荐

  1. 实用的JavaScript技巧

    1.数组去重 let arr = [...new Set([1,2,3,2,1])]; //输出:[1, 2, 3] 2.删除数组中的虚值(undefined .null.NaN.0 .'' .fal ...

  2. JS基础笔记汇总

    JS基础笔记最全的汇总 javascript介绍以及起源目录1.变量和常量的知识2.基本数据类型3.运算符4.基本数据类型间的转换5.流程控制语句 一.javascript介绍以及起源 js一种直译型 ...

  3. WSL2 网络异常排查 [ping 不通、网络地址异常、缺少默认路由、被宿主机防火墙拦截]

    最近在使用的 wsl2 的时候突然发现 wsl2 无法正常联网,即 ping 不通外网以及宿主机的 wsl 网卡.但是将 wsl 版本设置为 1 就可以联网了. 如果你是正常使用的时候,并且自己没有手 ...

  4. Java设计模式之策略模式(13)

    策略模式定义了一系列算法,每个算法封装起来,他们可以相互替换,且算法的变化不会影响到使用算法的客户.可以设计一个抽象类提供辅助. package WHP; public interface ICalc ...

  5. TS 之 reduce

    一.函数介绍 Array.reduce()方法是对数组进行遍历,返回一个计算后的值 使用方法: Array.reduce((acc, cur, idx, src) => { }, initial ...

  6. Cascader 级联选择器 数据不回显

    这次的问题原因主要是因为  数据存在于两张表  并且索引的字段不同   一个为id(int)一个为字符(string) 在做修改操作数据回显的时候会导致  后端返回的数组中一个为字符一个为bumber ...

  7. Git commit时提示错误时 解决办法

    问题描述: * Please tell me who you are.  Run  git config –global user.email "you@example.com"  ...

  8. python学习笔记-初始python(1)

    1.运行程序 python 使用cmd.exe 运行程序.  例子: python +[文件路径] 2.注释 当行注释:# 被注释内容 多行注释:'''被注释内容''',或者""& ...

  9. 关于Docker容器内不能ping通外网

    先在主机重启docker服务 systemctl stop docker systemctl start docker 然后再开启容器,进入容器 https://blog.csdn.net/qq_42 ...

  10. 创建一个简单的signalr项目

    1:新建一个empty的MVC项目 2:如果没有安装过signalr过那么要通过Nuget安装signalr 3:新建一个controller 然后建一个view =>index 4:新建一个s ...