bzoj luogu

题意:一颗数或是基环树,随机从某个点开始一直走,不走已经到过的点,求无路可走时的路径长期望。

对于一棵树:

用两个$dp$数组分别记录从这个点起向上向下走的期望

向下走的$dp$不用多说

向上走的$dp$:

对于从$u$计算$v$的dp

$dp[v]$应当是从u向周围引出所有路径减去走向t的路径的期望后再除以$deg_{u}-1$

对于基环树:

环上的点很少。

此时环上的点的向上$dp$指从u出发向环上两头走的期望。

如何计算:对于环上每一个点都向环的两头各dp一次取平均值。

完毕。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100011;
const double eps=1e-8;
template<typename TP>void read(TP &kk){#define ak *TP phy=0,ioi=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')ioi=-1;ch=getchar();}while(ch>='0'&&ch<='9'){phy=phy*10+ch-'0';ch=getchar();}kk=phy ak ioi;
}
int n,m;
struct sumireko
{int to,ne,w;
}e[N*2];
int he[N],ecnt;
void addline(int f,int t,int w)
{e[++ecnt].to=t;e[ecnt].ne=he[f];he[f]=ecnt;e[ecnt].w=w;
}
bool onr[N];
double deg[N],sc[N],dpu[N],dpd[N];
void dfs1(int x,int f)
{for(int i=he[x],t;i;i=e[i].ne){t=e[i].to;if(t==f||onr[t]) continue;dfs1(t,x);dpd[x]+=dpd[t]+e[i].w;}if(sc[x]>eps) dpd[x]/=sc[x];
}
void dfs2(int x,int f)
{for(int i=he[x],t;i;i=e[i].ne){t=e[i].to;if(f==t||onr[t]) continue;dpu[t]=e[i].w;if(deg[x]-1.0>eps)dpu[t]+=(dpd[x]*sc[x]-e[i].w-dpd[t]+dpu[x]*(deg[x]-sc[x]))/(deg[x]-1.0);dfs2(t,x);}
}
int rnd[N],hp;
int sp;bool vv[N];
int find(int x,int f)
{if(vv[x]){sp=x;return 1;}vv[x]=1;int tmp;for(int i=he[x],t;i;i=e[i].ne){t=e[i].to;if(t==f) continue;if(tmp=find(t,x)){if(tmp==1){rnd[++hp]=x;onr[x]=1;if(x!=sp) return 1;}return 2;}}return 0;
}
double dpt[N];
void dfs3(int x,int f,int o,int s)
{if(!o){int g=0;for(int i=he[x],t;i;i=e[i].ne){t=e[i].to;if(!onr[t]) continue;g++;dfs3(t,x,g,s);dpu[x]+=dpt[t]+e[i].w;}dpu[x]/=2;return;}double tmp=0;dpt[x]=0;for(int i=he[x],t;i;i=e[i].ne){t=e[i].to;if(!onr[t]||t==s||t==f) continue;dfs3(t,x,o,s);dpt[x]+=dpt[t]+e[i].w;tmp+=1;}if(sc[x]+tmp>eps)dpt[x]=(dpt[x]+dpd[x]*sc[x])/(sc[x]+tmp);
}double ans;
int xi,yi,wi;
int main()
{read(n),read(m);for(int i=1;i<=m;i++){read(xi),read(yi),read(wi);addline(xi,yi,wi),addline(yi,xi,wi),deg[xi]+=1,deg[yi]+=1;}if(m==n-1){for(int i=1;i<=n;i++) sc[i]=deg[i]-1;sc[1]+=1;dfs1(1,0);dfs2(1,0);for(int i=1;i<=n;i++) ans+=(dpd[i]*sc[i]+dpu[i])/deg[i];ans/=n;printf("%.5lf\n",ans);return 0;}find(1,0);for(int i=1;i<=n;i++) sc[i]=deg[i]-(onr[i]?2.0:1.0);for(int i=1;i<=hp;i++) dfs1(rnd[i],0);for(int i=1;i<=hp;i++) dfs3(rnd[i],0,0,rnd[i]);for(int i=1;i<=hp;i++) dfs2(rnd[i],0);for(int i=1;i<=n;i++) ans+=(dpd[i]*sc[i]+dpu[i]*(deg[i]-sc[i]))/deg[i];ans/=n;printf("%.5lf\n",ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/rikurika/p/11271194.html

[bzoj2878][Noi2012]迷失游乐园(基环树dp)相关推荐

  1. bzoj2878 [Noi2012]迷失游乐园——概率期望DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2878 这个博客写得很好:https://www.cnblogs.com/qt666/p/72 ...

  2. BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )

    一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...

  3. 基环树DP(bzoj 1040: [ZJOI2008]骑士)

    树:n个点n-1条边的连通图 基环树:n个点n条边的连通图,也就是一个环套着多棵树 基环树DP:找到环上任意相邻两点,断掉这两点之间的边,就形成了一棵树 之后对这两点分别进行一次树形DP即可 例题: ...

  4. 【暖*墟】#动态规划# 基环树DP的学习与练习

    因为弃置了 四边形不等式优化 ,所以DP的任务还剩下 基环树DP / 插头DP / 动态DP 当然,树形DP / 状压DP / 数位DP / 斜率优化DP 也还是要练习的...... 一 . 基环树的 ...

  5. 【基环树DP】[NOI2012]迷失游乐园

    题目描述 Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多 ...

  6. BZOJ1040 骑士(基环树DP)

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...

  7. bzoj 2878 [Noi2012]迷失游乐园——树上的期望dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2878 很好的树上概率题的思路,就是分成up和down. 代码中有众多小细节.让我弃疗好几天的 ...

  8. 【BZOJ 2878】 [Noi2012]迷失游乐园

    Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环( ...

  9. acwing-1080. 骑士(基环树dp)

    Z 国的骑士团是一个很有势力的组织,帮会中聚集了来自各地的精英. 他们劫富济贫,惩恶扬善,受到了社会各界的赞扬. 可是,最近发生了一件很可怕的事情:邪恶的 Y 国发起了一场针对 Z 国的侵略战争. 战 ...

  10. 【BZOJ1040】【codevs1423】骑士,第一次的基环外向树DP

    传送门1 传送门2 思路: 好题 比较简单的DP思路 之前没写过基环树DP,第一次搞真心orz 我们发现这些元素是具有从属关系的 也就是说如果对"厌恶的骑士"两两相互连边,那么问题 ...

最新文章

  1. N-gram统计语言模型(总结)
  2. win10 ObservableCollection 排序自动收缩问题
  3. halcon python缺陷检测_halcon边缘提取缺陷检测的思路
  4. 图像形状特征(八)--SC形状上下文
  5. Android Studio 离线本地 TTS语音合成 Kotlin代码
  6. UVM-1.1学习(一)——uvm代码的分类
  7. Java如何实现阶梯字符型输出
  8. 你的终极目标是什么?
  9. 利用CaaS控制虚拟机蔓延
  10. camera具体曝光时间readout时间出图时间
  11. mysql 5.1 变量专题
  12. python强制终止_python强制终止
  13. 【线性代数】6-7:SVD分解(Singular Value Decomposition-SVD)
  14. 博客英语作文写作技巧_网络写作技巧
  15. 华为设备配置策略路由引流到旁挂防火墙
  16. 旋转接头出现故障的原因分享
  17. 未来教师是否会被计算机取代,未来老师会被计算机所取代吗?Will The Teacher be Replaced by Computers in the Future?...
  18. 好消息与坏消息应该怎么说
  19. 儒家的“天下观念”与“文化决定论”
  20. 华硕B85M-E BIOS NVME m.2 mmtool4.5 硬盘提速25倍

热门文章

  1. (三)java版spring cloud+spring boot 社交电子商务平台 - Spring Cloud集成项目简介
  2. 使用p4c将P4 14代码转换为16代码
  3. Android apk如何加固防止被破解(防止逆向编译)
  4. 让A超链接无效的办法 阻止元素发生默认的行为
  5. 构造函数初始化列表用的是构造函数
  6. Office Communications Server 和客户端使用的端口和协议
  7. idea关于连接mysql数据库异常解决的方法
  8. mysql-debug: Thread stack overrun
  9. [转]JAVA与.NET DES加密解密
  10. 【sampleDateFormat】对日期进行解析