Link:

传送门

Solution:

原来CF的官方题解也能鸽啊……

详细题解

该题思路:

1、对于每个点删边方案数为$fac[n-1]$,总贡献为每种方案下满足的概率的和,接下来直接求贡献

2、每次将该点看成根,树形$dp$,设$dp[i][j]$表示根到$i$该子树还有$j$条边的贡献

3、考虑合并子树(算上根到子树的边),由于两边互不影响,相乘后再乘上删边顺序不同的组合数皆可

$dp[v1][i]*dp[v2][j]*C(i+j,i)*C((sz[v1]-1-i)+(sz[v2]-1-j),sz[v1]-1-i)$

4、考虑用子树答案$dp[i]$算出加上子树根到其父亲的边后$cur[j]$的答案

$j>i$时为了不重复计算,变数只有最后$u,v$的合并,产生的贡献为$0.5*dp[i]$

$j=i$时考虑$u,v$合并和$sz[v]-1-i$条边的删除顺序任意,产生贡献为$(sz[v]-i)*dp[i]$

Code:

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=;
struct edge{int nxt,to;}e[MAXN<<];
int n,x,y,head[MAXN],sz[MAXN],tot;
db cur[MAXN],tmp[MAXN],dp[MAXN][MAXN],fac[MAXN]; void add(int x,int y)
{e[++tot]=(edge){head[x],y};head[x]=tot;}
db C(int x,int y)
{return fac[x]/(fac[x-y]*fac[y]);}
db solve(int x,int y)
{return C(x+y,x);}
void dfs(int x,int anc)
{
sz[x]=;dp[x][]=;
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=anc)
{
dfs(e[i].to,x);
memset(cur,,sizeof(cur));
memset(tmp,,sizeof(tmp));
for(int j=;j<=sz[e[i].to];j++)
{
for(int k=;k<j;k++)
cur[j]+=0.5*dp[e[i].to][k];
cur[j]+=(sz[e[i].to]-j)*dp[e[i].to][j];
} for(int j=;j<sz[x];j++)
for(int k=;k<=sz[e[i].to];k++)
tmp[j+k]+=dp[x][j]*cur[k]*solve(j,k)*solve(sz[e[i].to]-k,sz[x]--j);
for(int j=;j<sz[x]+sz[e[i].to];j++) dp[x][j]=tmp[j];
sz[x]+=sz[e[i].to];
}
} int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d%d",&x,&y),add(x,y),add(y,x);
fac[]=;
for(int i=;i<=n;i++) fac[i]=fac[i-]*i;
for(int i=;i<=n;i++)
dfs(i,),printf("%.10lf\n",dp[i][n-]/fac[n-]);
return ;
}

[Codeforces 1060F] Shrinking Tree的更多相关文章

  1. Problem - D - Codeforces Fix a Tree

    Problem - D - Codeforces  Fix a Tree 看完第一名的代码,顿然醒悟... 我可以把所有单独的点全部当成线,那么只有线和环. 如果全是线的话,直接线的条数-1,便是操作 ...

  2. Codeforces 1060 F. Shrinking Tree

    题目链接 一道思维好题啊...感觉这种类型的题很检验基本功是否扎实(像我这样的就挂了). 题意:你有一棵\(n\)个点的树,每次随机选择一条边,将这条边的两个端点合并,并随机继承两个点标号中的一个,问 ...

  3. Solution -「CF 1060F」Shrinking Tree

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的树,反复随机选取一条边,合并其两端两点,新点编号在两端两点等概率选取.问每个点留到最后的概率.    ...

  4. Codeforces 765 E. Tree Folding

    题目链接:http://codeforces.com/problemset/problem/765/E $DFS子$树进行$DP$ 大概分以下几种情况: 1.为叶子,直接返回. 2.长度不同的路径长度 ...

  5. codeforces 570 D. Tree Requests 树状数组+dfs搜索序

    链接:http://codeforces.com/problemset/problem/570/D D. Tree Requests time limit per test 2 seconds mem ...

  6. CodeForces 383C Propagating tree

    Propagating tree Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...

  7. 【19.77%】【codeforces 570D】Tree Requests

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  9. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

随机推荐

  1. js小记:对象、原型及原型链、面向对象编程

    一.js对象 1.js对象 js对象是一种复合数据类型,它可以把多个(不同类型的)数据集中在一个变量中,并且给每个数据起名字. 2.对象与数组 对象的每个数据有对应的名字(属性名),我们通过叫名字访问 ...

  2. [CodePlus 2017 11月赛]晨跑 题解(辗转相除法求GCD)

    [CodePlus 2017 11月赛]晨跑 Description "无体育,不清华"."每天锻炼一小时,健康工作五十年,幸福生活一辈子".在清华,体育运动绝 ...

  3. 【总结】对FFT的理解 / 【洛谷 P3803】 【模板】多项式乘法(FFT)

    题目链接 \(\Huge\text{无图,慎入}\) \(FFT\)即快速傅里叶变换,用于加速多项式乘法. 如果暴力做卷积的话就是一个多项式的每个单项式去乘另一个多项式然后加起来,时间复杂度为\(O( ...

  4. js获得页面鼠标位置

    1.客户区坐标位置:clientX,clientY 鼠标相对于在当前页面可视范围左上角的位置 2.页面坐标位置:pageX,pageY 鼠标相对于页面左上角的位置(受滑动等影响,例如pageY=cli ...

  5. javaScript操作数组的常用方法

    map(映射), reduce(规约), forEach(遍历), filter(过滤),它们都是高阶函数,都是以传入不同的函数来以不同的方式操作数组元.ie都不支持 判断是否为数组 Array.is ...

  6. CDN基础详解

    什么是 CDN?     Origin Server: 源站,也就是做 CDN 之前的客户真正的服务器;   User: 访问者,也就是要访问网站的网民;   Edge Server: CDN 的服务 ...

  7. three.js_camera相机

    https://blog.csdn.net/yangnianbing110/article/details/51275927 文章地址

  8. perl6正则 2: 字母,数字,空格,下划线, 字符集

    数字, 字母, 下划线 在perl6中, 如果是 数字, 字母, 下划线, 在正则里可以正接写上. > so / True > so 'perl6_' ~~ /_/ True > 非 ...

  9. go时间和日期

    1. time包 2. time.Time类型,用来表示时间 3. 获取当前时间, now := time.Now() 4. time.Now().Day(),time.Now().Minute(), ...

  10. UBIFS学习笔记

    在做项目的时候,发现flash芯片有异常现象,经过打印分析,发现是UBIFS方面设置有一些问题,经过查阅一部分资料,最终得到问题的答案. 在解决问题的过程中,发现打印信息比较重要,但网上并没有直接的相 ...