2023河南萌新联赛第(六)场:河南理工大学-C 旅游

2023河南萌新联赛第(六)场:河南理工大学

https://ac.nowcoder.com/acm/contest/63602/C

文章目录

题意

小C喜欢旅游,现在他要去DSH旅游,DSH里有 n n n个城市和 n − 1 n−1 n−1条双向道路(每条道路长度为1),每条道路连接两个城市,并且任意两个城市都可以通过这些的道路互相到达。现在小C要使用魔法指定传送到DSH里的一个城市,作为他旅游的出发城市,小C旅游遵从以下原则:

  1. 当小C抵达一个城市的时候,他会去跟当前这个城市相连的城市;
  2. 他只去他以前没有去过的城市;
  3. 在每个城市,小C以相同的概率移动去上述符合要求的城市;

当没有这样的城市(可走)时,小C就停下了。

由于小C太喜欢DSH了,所以请你告诉小C,在他可以指定传送出发城市的情况下,他的旅游路径的期望最大值是多少。

解题思路

先确定 1 1 1为根节点,设 d p x dp_x dpx表示以 x x x为根的子树内走过节点个数的期望值,则 d p x = 1 + 1 ∣ s o n x ∣ ∑ s ∈ s o n x d p s dp_x=1+\frac{1}{|son_x|}\sum_{s\in son_x}dp_s dpx=1+∣sonx∣1∑s∈sonxdps,求出后,设 f x f_x fx表示以 x x x为出发点,经过节点个数的期望值,显然 f 1 = d p 1 f_1=dp_1 f1=dp1,可以用换根 d p dp dp, O ( n ) O(n) O(n)求出 { f } \{f\} {f},对于 f x f_x fx,其值包括其原来的子树的贡献和原来的父亲 f a fa fa的贡献。首先考虑子树,贡献为 1 ∣ s o n x + 1 ∣ ∑ s ∈ s o n x f s \dfrac{1}{|son_x+1|}\sum_{s\in son_x}f_s ∣sonx+1∣1∑s∈sonxfs,可以发现 ∑ s ∈ s o n x f s = ( d p x − 1 ) × ∣ s o n x ∣ \sum_{s\in son_x}f_s=(dp_x-1)\times|son_x| ∑s∈sonxfs=(dpx−1)×∣sonx∣,所以为 ∣ s o n x ∣ ∣ s o n x + 1 ∣ ( d p x − 1 ) \dfrac{|son_x|}{|son_x+1|}(dp_x-1) ∣sonx+1∣∣sonx∣(dpx−1)。对于 f a fa fa的贡献,包括以 f a fa fa为根的树的期望减去以 x x x为儿子的贡献,为 v e c f a . s i z e ( ) × f f a − d p x − 1 v e c f a . s i z e ( ) − 1 × 1 ∣ s o n x ∣ + 1 \dfrac{vec_{fa}.size()\times f_{fa}-dp_x-1}{vec_{fa}.size()-1}\times\dfrac{1}{|son_x|+1} vecfa.size()−1vecfa.size()×ffa−dpx−1×∣sonx∣+11(之所以用 v e c f a . s i z e ( ) vec_{fa}.size() vecfa.size()是避免 f a = 1 fa=1 fa=1时再分类讨论),加上其本身,整理可得:
f x = 1 ∣ s o n x ∣ + 1 ( ( d p x − 1 ) × ∣ s o n x + 1 ∣ + v e c f a . s i z e ( ) × f f a − d a x − 1 v e c f a . s i z e ( ) − 1 ) + 1 f_x=\dfrac{1}{|son_x|+1}((dp_x-1)\times|son_x+1|+\dfrac{vec_{fa}.size()\times f_{fa}-da_x-1}{vec_{fa}.size()-1})+1 fx=∣sonx∣+11((dpx−1)×∣sonx+1∣+vecfa.size()−1vecfa.size()×ffa−dax−1)+1

记得 g g g表示的是节点数,答案要求路径长,要将最大值减一。

代码

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n;
double dp[N],f[N],ma;
vector<int>ve[N];
void dfs1(int u,int fa){
	int cnt=(ve[u].size()-(u!=1?1:0));
	for(auto v:ve[u]){
		if(v==fa)continue;
		dfs1(v,u);
		dp[u]+=1.0/cnt*dp[v];
	}
	dp[u]=dp[u]+1;
}
void dfs2(int u,int fa){
	ma=max(f[u],ma);
	int sum=ve[u].size();
	for(auto v:ve[u]){
		if(v==fa)continue;
		int cnt=ve[v].size()-1;
		f[v]=(1.0*(dp[v]-1)*cnt+(sum>1?(sum*f[u]-dp[v]-1)/(sum-1):1))/(cnt+1)+1;
		dfs2(v,u);
	}
}
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		ve[u].push_back(v);
		ve[v].push_back(u);
	}
	dfs1(1,0);
	f[1]=dp[1];
	dfs2(1,0);
	printf("%.3lf",ma-1);
}
相关推荐
罗湖老棍子1 小时前
Biorhythms(信息学奥赛一本通- P1639)
算法·数论·裴蜀定理·扩展欧几里得·扩展中国剩余定理
程序喵大人6 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
奋发向前wcx7 小时前
CSP-J复赛模拟赛4 王晨旭补题 2026.10.5
算法
by209998 小时前
vector 的模拟实现:扩容与边界的详细阐述(下)
c++·经验分享·vector·动态数组
念何架构之路9 小时前
zap采样器与性能优化内幕
算法·性能优化·哈希算法
晒太羊的猫10 小时前
hot100动态规划刷题
算法·动态规划
weixin_5310946910 小时前
heap_4内存管理
java·开发语言·算法
余额瞒着我当琳10 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
程序员南飞11 小时前
win系统安装minio
java·数据结构·算法
青少儿编程课堂11 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛