小 B 的树
题目背景及题意
小 B 有一颗树,它的形态与 OI 中的树相同,有 n 个节点,n-1 条边,每条边长度为 1 随着时间的流逝这棵树长大了,每条边有 50%的概率长度变为 2 
小 B 想知道这棵树期望的直径是多少,可是他太菜了并不会,所以来求教你
输入格式
第一行一个 n 代表树上点的个数
接下来 n-1 行,每行两个整数,表示一条边
输出格式
一个实数,表示直径的期望
数据范围
打包,总共 10 个包,第 i 个包里的 n=i*5+10
 

sol:学长题解写的很好,自己都能看懂,就是写起来很操蛋(有详细注释,那处写挂的ts了一年)

upd:感觉自己全部在fp

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,M=;
int n,mx[N],sz[N];
/*
mx[i]表示包括i在内的以i为根的子树中的最长链
sz[i]表示以i为根的子树大小
*/
int tot=,Next[M],to[M],head[N];
double dp[N][M][M],f[][M][M][M],ans=0.0;
/*
dp[i][j][k]表示i的子树,最大深度为j,直径<=k的概率 做的时候按照直径=k做,然后搞一遍前缀和即可
f[i][j][k][l]表示在x的子树中前i个儿子的子树中,最长链为j,次长链为k,直径<=l的概率(因为是从dp转移过来的,直接带前缀和)
*/
inline void Link(int x,int y)
{
Next[++tot]=head[x]; to[tot]=y; head[x]=tot;
}
inline void dfs(int x,int fat)
{
int e,i,j,k,l,t;
sz[x]=;
for(e=head[x];e;e=Next[e]) if(to[e]!=fat)
{
dfs(to[e],x); sz[x]+=sz[to[e]];
}
for(i=;i<=sz[x]*;i++) f[t=][][][i]=1.0;
for(e=head[x];e;e=Next[e]) if(to[e]!=fat)
{
int V=to[e];
t^=;
for(i=;i<=mx[V];i++) for(j=;j<=(sz[x]*);j++) dp[V][i][j]+=dp[V][i][j-];//前缀和
//注意这里j要转移到sz[x]*2而不是sz[V]*2,虽然后面对于V而言没有数值,但在x转移是要用啊!!!!!
for(i=;i<=mx[x];i++) for(j=;j<=i;j++) for(k=;k<=sz[x]*;k++)//最长链,次长链,直径(不一定要求一定直径最长)
{
double tmp=f[t^][i][j][k];
f[t^][i][j][k]=; //要加入一个新儿子了
for(l=;l<=mx[V];l++)//枚举V中的最长链长度
{
double val=dp[V][l][k]*0.5;//0.5是要分类转移 if(l+>i) f[t][l+][i][k]+=tmp*val;
else if(l+>j) f[t][i][l+][k]+=tmp*val;
else f[t][i][j][k]+=tmp*val; if(l+>i) f[t][l+][i][k]+=tmp*val;
else if(l+>j) f[t][i][l+][k]+=tmp*val;
else f[t][i][j][k]+=tmp*val;
}
}
mx[x]=max(mx[x],mx[V]+);
}
// printf("%d %d %lf %lf ",x,mx[x],f[t][mx[x]][0][mx[x]],f[t][mx[x]][0][mx[x]-1]);
for(i=;i<=mx[x];i++) for(j=;j<=i;j++) for(k=sz[x]*;k>=;k--)
{
if(k!=) f[t][i][j][k]-=f[t][i][j][k-];
dp[x][i][max(i+j,k)]+=f[t][i][j][k];
f[t][i][j][k]=;
}
// printf("%lf %lf\n",dp[x][mx[x]][mx[x]],dp[x][mx[x]][mx[x]-1]);
}
int main()
{
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
int i,j,x,y;
R(n);
for(i=;i<n;i++)
{
R(x); R(y); Link(x,y); Link(y,x);
}
dfs(,);
// printf("%lf %lf %lf %lf %lf\n",dp[1][4][4],dp[1][5][5],dp[1][6][6],dp[1][7][7],dp[1][8][8]);
// for(i=1;i<=n;i++) cout<<i<<' '<<mx[i]<<' '<<sz[i]<<endl;
for(i=;i<=mx[];i++) for(j=;j<=n*;j++) ans+=dp[][i][j]*j;
printf("%lf\n",ans);
return ;
}

7.19T2的更多相关文章

  1. 终极锁实战:单JVM锁+分布式锁

    目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的场景:多人同 ...

  2. CSS中的margin、border和padding的区别

    aaarticlea/gif;base64,R0lGODlhuQEbAbMAAP8AM8zMzGZmYszMmZmZZkIP/5qE/8zM/wICApmZmf//zP///wAAAAAAAAAAAA

  3. 【411】COMP9024 Assignment1 问题汇总

    1. 构建 Makefile 文件后运行错误,undefined reference to 'sqrt' 实际上是没有链接math数学库,所以要 $gcc test.c –lm //-lm就是链接到m ...

  4. 【406】C语言相关函数

    <stdlib.h>(1) <stdlib.h>(2) malloc() 用来动态地分配内存空间,分配成功返回指向该内存的地址,失败则返回 NULL. 前面的 (int*) 或 ...

随机推荐

  1. linux下mysql部署

    mysql 1.拓扑结构 mysql集群有如下三层: 应用程序层:负责与mysql服务器通信的各种应用程序. Mysql服务器层:处理SQL命令,并与NDB存储引擎通信和Mysql服务器. NDB集群 ...

  2. element-ui 中 table 鼠标悬停时背景颜色修改

    样式穿透: /deep/ .el-table tbody tr:hover>td { background-color: #颜色 }

  3. [NOIP10.6模拟赛]2.equation题解--DFS序+线段树

    题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...

  4. javaIO——BufferedReader

    今天来学习一下 java.io.BufferedReader ,从命名可以看出,跟前面学习的 StringReader 和 CharArrayReader 有些不一样,这些都是按照数据源类型命名,Bu ...

  5. 1 简介mvp模式

    1   模型-视图-表示器也称为监视控制器模式 ,如下图表示 2 mvp 模式希望通过表示器(presenter)来关联网页,而不必在他们之间建立严格的 3 一个简单的mvp架构的例子 public ...

  6. 20.SSM整合-全注解开发

    全注解开发 1.将SpringMVC改为注解 修改spring-mvc.xml 2.将Spring改为注解 将Service改为注解,完成Dao的注入 将事务以注解方式织入到Service 1.修改s ...

  7. SQL脚本优化

    1.创建索引一.要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引   (1)在经常需要进行检索的字段上创建索引,比如要按照表字段username进行检索,那么就应 ...

  8. 简单介绍 Java 构造器

    导读 构造器是编程的强大组件.使用它们来释放 Java 的全部潜力. 在开源.跨平台编程领域,Java 无疑(?)是无可争议的重量级语言.尽管有许多伟大的跨平台框架,但很少有像 Java 那样统一和直 ...

  9. easyUI 布局

    Layout(布局) 布局容器有5个区域:北.南.东.西和中间.中间区域面板是必须的,边缘的面板都是可选的. 每个边缘区域面板都可以通过拖拽其边框改变大小,也可以点击折叠按钮将面板折叠起来.布局可以进 ...

  10. C#DataGrid列值出现E形式的小数,将DataGrid表格上的数据保存至数据库表时会因格式转换不正确导致报错

    问题描述:在DataGridView中调整金额一列,当输入小数0.000001后会显示1E-6,此时进行保存操作时报错,提示无法将string类型转换成Decimal 原因分析:由于列调整金额为1E- ...