【NOI2012】迷失游乐园【概率期望】【换根dp】【基环树】

传送门

题意:给一棵nnn个点的带边权树或基环树,随机选一个点作为起点,每次随机走到一个相邻未走过的位置,直到无路可走。求期望路径长度。

n≤105n \leq 10^5n105,为基环树时环的大小不超过202020

先考虑树怎么做废话

先只考虑从根往下走

显然就是

fu=∑v∈son(u)w(u,v)+f(v)∣son(u)∣f_u={\sum_{v\in son(u)}w(u,v)+f(v) \over|son(u)|}fu=son(u)vson(u)w(u,v)+f(v)

考虑其他位置

再考虑强制第一步往上走,然后强行不走回来的期望为ggg

方程见代码

对于基环树,fff不受影响。

对于环上的点两个方向带着走到这里的概率和距离转一圈,算出ggg,树上点方程不变。

然后就可以了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 100005
#define MAXM 200005
using namespace std;
struct edge{int u,v,w;}e[MAXM];
int head[MAXN],nxt[MAXM],cnt;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
void addnode(int u,int v,int w)
{e[++cnt]=(edge){u,v,w};nxt[cnt]=head[u];head[u]=cnt;
}
int n,m,son[MAXN];
double F[MAXN],G[MAXN];
namespace Tree
{void dfs(int u,int f){for (int i=head[u];i;i=nxt[i])if (e[i].v!=f){++son[u];dfs(e[i].v,u);F[u]+=F[e[i].v]+e[i].w;}if (son[u]) F[u]/=son[u];}void DFS(int v,int f){int u=e[f].u;G[v]=e[f].w+((u==1&&son[u]==1)? 0:((G[u]+F[u]*son[u]-F[v]-e[f].w)/(son[u]-(u==1))));for (int i=head[v];i;i=nxt[i])if (e[i].v!=u)DFS(e[i].v,i);}void solve(){dfs(1,0);for (int i=head[1];i;i=nxt[i]) DFS(e[i].v,i);double ans=F[1];for (int i=2;i<=n;i++) ans+=G[i]/(son[i]+1)+F[i]*son[i]/(son[i]+1);printf("%.5f",ans/n);}
}
namespace Circle
{bool vis[MAXN],isrt[MAXN];int rt[MAXN],w[MAXN],tot,tmp;void findroot(int u,int f){vis[u]=true;for (int i=head[u];i;i=nxt[i])if (!vis[e[i].v]&&e[i].v!=rt[1]){findroot(e[i].v,u);if (isrt[e[i].v]&&e[i].v!=tmp) isrt[rt[++tot]=u]=true,w[tot]=e[i].w;}elseif (e[i].v!=f&&e[i].v!=rt[1])isrt[rt[tot=1]=u]=true,w[1]=e[i].w,tmp=e[i].v;vis[u]=false;}void DFS(int v,int f){int u=e[f].u;if (isrt[u]) G[v]=e[f].w+2.0/(son[u]+1)*G[u]+(F[u]*son[u]-F[v]-e[f].w)/(son[u]+1);else G[v]=e[f].w+(G[u]+F[u]*son[u]-F[v]-e[f].w)/son[u];for (int i=head[v];i;i=nxt[i])if (e[i].v!=u)DFS(e[i].v,i);}void solve(){findroot(1,0);for (int t=1;t<=tot;t++){int u=rt[t];for (int i=head[u];i;i=nxt[i])if (!isrt[e[i].v])++son[u],Tree::dfs(e[i].v,u),F[u]+=F[e[i].v]+e[i].w;if (son[u]) F[u]/=son[u];}for (int i=1;i<=tot;i++){double p=0.5;int dis=0;for (int j=i%tot+1;j!=i;j=j%tot+1){dis+=w[j];if (j%tot+1==i) G[rt[i]]+=p*(dis+F[rt[j]]);else G[rt[i]]+=p*son[rt[j]]/(son[rt[j]]+1)*(dis+F[rt[j]]);p*=1.0/(son[rt[j]]+1);}p=0.5,dis=w[i];for (int j=(i==1? tot:i-1);j!=i;j=(j==1? tot:j-1)){if (i%tot+1==j) G[rt[i]]+=p*(dis+F[rt[j]]);else  G[rt[i]]+=p*son[rt[j]]/(son[rt[j]]+1)*(dis+F[rt[j]]);p*=1.0/(son[rt[j]]+1);dis+=w[j];}}for (int t=1;t<=tot;t++){int u=rt[t];for (int i=head[u];i;i=nxt[i])if (!isrt[e[i].v])DFS(e[i].v,i);}double ans=0;for (int i=1;i<=n;i++) ans+=(isrt[i]+1)*G[i]/(son[i]+isrt[i]+1)+F[i]*son[i]/(son[i]+isrt[i]+1);printf("%.5f",ans/n);	  }
}
int main()
{n=read(),m=read();for (int i=1;i<=m;i++){int u,v,w;u=read(),v=read(),w=read();addnode(u,v,w);addnode(v,u,w);}if (m==n-1) Tree::solve();else Circle::solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Educational Codeforces Round 37 (Rated for Div. 2) E. Connected Components? 暴力 + 补图的遍历

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤2e5,m≤2e5n\le2e5,m\le2e5n≤2e5,m≤2e5。 思路&#xff1a; 这是题是我上个题的一部分&#xff0c;算是个小知识点&#xff0c;暴力能过。 直接维护一个setsetset&#xff0c;让后遍历所有点&#xff…

初探System.Threading.Channels

。System.Threading.Channels是.Net Core基础类库中实现的一个多线程相关的库&#xff0c;专门处理数据流相关的操作&#xff0c;用来在生产者和订阅者之间传递数据&#xff08;不知道可不可以理解为线程间传递数据&#xff0c;我把它类比成了Go语言中的Channel&#xff09;&am…

【LOJ6033】棋盘游戏【二分图博弈】

传送门 显然是个二分图&#xff0c;设开始位置是左边&#xff0c;另一边是右边 那么先手是把左边挪到右边&#xff0c;后手是把右边挪到左边&#xff0c;不能挪的那方失败 结论&#xff1a;Alice必胜当且仅当开始位置不一定在最大匹配上 必要性&#xff1a; 如果开始位置不…

Codeforces Round #715 (Div. 1) B. Almost Sorted 找规律

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 找规律yydsyydsyyds。 一看没什么想法&#xff0c;所以打了个表&#xff0c;好家伙&#xff0c;不打不知道&#xff0c;一打不得了&#xff0c;下面是n6n6n6的符合要求的情况&#xff1a; …

SQL Server之索引解析(二)

、堆表堆表通过IAM连接一起&#xff0c;查询时全表扫描。1、1 非聚集索引结构叶子节点数据结构&#xff1a;行数据结构Rid&#xff08;8字节&#xff09;中间节点数据结构&#xff1a; &#xff08;非聚集非唯一索引&#xff09;行数据结构Page&#xff08;4&#xff09;2 Rid&…

【NOI2011】兔兔与蛋蛋的游戏【二分图博弈】

传送门 结论 不会有同一个棋子移动两次 反证法&#xff0c;对于第一个移动第二次的棋子 设两次移动之间(含)的移动的棋子为A1,A2,A3,……&#xff0c;AnA_1,A_2,A_3,……&#xff0c;A_nA1​,A2​,A3​,……&#xff0c;An​&#xff08;指棋子本身而非位置&#xff09; 因…

CF1528C dfs序+set维护

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两棵有nnn个节点的树&#xff0c;我门记第一棵为aaa&#xff0c;第二棵为bbb&#xff0c;现在你有一个nnn个点都孤立的点集&#xff0c;两个点u,vu,vu,v可以连边当且仅当这两个点在aaa树中一个是另一个的…

纠正一个错误,分布式系统关注点第17篇

这里是Z哥的个人公众号每周五早8点 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「78」篇原创敬上今天来加个餐&#xff0c;紧急纠正一个错误。先和大家说一声抱歉&#xff1a;D昨晚睡觉前&#xff0c;惯例打开「订阅号助手」回复一些留言。有一位小伙伴提了…

【NOI2016】国王饮水记【贪心】【斜率优化】【决策单调性】

传送门 首先比h1h_1h1​小的肯定没用&#xff0c;直接无视 然后考虑合并的顺序 ①在无限制的情况下&#xff0c;合并多个不如一个一个合并 a<b<ca<b<ca<b<c时&#xff0c;ab2c2>abc3{{ab \over 2}c\over 2}>{{abc}\over 3}22ab​c​>3abc​ ②先…

CF946D Timetable 背包dp + 思维转换

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n,m,k≤500n,m,k\le500n,m,k≤500 思路&#xff1a; 将其转换成背包的模型&#xff0c;就可以想出来一个很明显的dpdpdp状态&#xff1a;f[i][j]f[i][j]f[i][j]表示前iii行花费了jjj的最小代价&#xff0c;…

.NET开发框架(三)-高可用服务器端设计

我们对框架功能作了简述&#xff0c;演示视频请点击 这里查看 &#xff0c;本章节&#xff0c;我们专门讲解一下&#xff0c;如何在Window服务器下&#xff0c;设计高可用的框架。我们的框架设计采用的是Window版本的服务端设计&#xff1a;整体框架图如下&#xff0c;为什么我…

P1537 弹珠 背包可行性dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 疯狂水文章。 这个很明显是个背包&#xff0c;我们开一个布尔数组&#xff0c;之后枚举每组的个数&#xff0c;让后枚举1−61-61−6&#xff0c;再枚举容量kkk&#xff0c;注意顺序不能错了…

【NOI2012】骑行川藏【拉格朗日乘数法】【二分套二分】

传送门 拉格朗日乘数法裸题 限制 f({v})∑i1nkisi(vi−vi′)EUf(\{v\})\sum_{i1}^nk_is_i(v_i-v_i)E_Uf({v})i1∑n​ki​si​(vi​−vi′​)EU​ 求 g({v})∑i1nsivig(\{v\})\sum_{i1}^n\frac{s_i}{v_i}g({v})i1∑n​vi​si​​ 最小值 设 L(λ,{v})g({v})λ[f({v})−EU]∑…

.NET Core 3.0中的WinForms创建集中式拉取请求中心

Windows 窗体&#xff08;或简称 WinForms&#xff09;&#xff0c;多年来被用于开发具有丰富和交互式界面的基于 Windows 的强大应用程序。各类企业对这些桌面应用程序的投入量非常巨大&#xff0c;每月有大约 240 万开发人员使用 Visual Studio 创建桌面式应用。利用和扩展现…

CF296B dp\容斥

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤1e5n\le1e5n≤1e5 思路&#xff1a; 求方案数基本就是考虑dpdpdp了&#xff0c;看到nnn这么大可以考虑一下分情况讨论的dpdpdp状态。 设f[i][j]f[i][j]f[i][j]表示到了第iii个&#xff0c;状态为jjj的方…

min_25筛详解

扯淡 min_25筛是由min_25提出的求积性函数前缀和的亚线性算法&#xff0c;和一个叫“扩展埃氏筛”的东西有着微妙的关系。 至于是什么关系&#xff0c;我也不太清楚&#xff0c;反正有人说很像有人说就是一个东西&#xff08;雾&#xff09; 这段话并不是废话 约定 为了方…

asp.net core 自定义异常处理中间件

Intro在 asp.net core 中全局异常处理&#xff0c;有时候可能不能满足我们的需要&#xff0c;可能就需要自己自定义一个中间件处理了&#xff0c;最近遇到一个问题&#xff0c;有一些异常&#xff0c;不希望记录错误日志&#xff0c;目前主要是用户请求取消导致的 TaskCanceled…

CF786B Legacy 线段树优化建图

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 实现如下连边后跑最短路。 思路&#xff1a; 优化建图板子题&#xff0c;优化思路就是将区间分割成若干个线段树上的线段&#xff0c;与线段树分治有点类似&#xff0c;由于有点向区间也有区间向点的边&a…

【ZJOI2015】幻想乡 Wi-Fi 搭建计划【几何】【贪心】【dp】

传送门 题意&#xff1a;一个x∈(−∞,∞),y∈[0,R]x\in(-\infin,\infin),y\in[0,R]x∈(−∞,∞),y∈[0,R]的矩形中有nnn个点&#xff0c;矩形外有mmm个半径均为RRR的圆&#xff0c;有独立的代价cic_ici​。求覆盖最多的点所需的最小代价。 n,m≤100n,m\leq100n,m≤100 显然先…

.NET架构开发应知应会

.NET程序是基于.NET framework、.NET Core、Mono、UWP【.NET实现】开发和运行的 &#xff0c;定义以上【.NET实现】的标准规范称为.NET StandardL1&#xff1a;.NET Standard.NET标准是一组API集合&#xff0c;由上层三种【.NET实现】的Basic Class Library实现&#xff0c;更正…