旅行的意义

博客围绕旅行时间期望的计算展开。天天在1号城市,到旅游城市先玩一天,第二天可留或去其他城市,玩3天必须离开。思路是设dp[i]为从i为起点的旅行时间期望,根据不同选择和情况计算各阶段期望。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

旅行的意义

题意:天天在1号城市,他每到达一个旅游城市都会先花一天的时间游玩当地的旅游景点,第二天会随机选择一条路线花费一天时间去其他城市玩,或者继续在当前城市玩,但是当他在这座城市玩了3天后他必须要去其他的城市。求他旅行时间的期望。

思路:设dp[i]为从i为起点的旅行时间期望,第一天必须在当地玩,dp[i]=1.假设有n个城市和i相连,那么第二天就有1/(n+1)个选择,选择在本地再玩一天,期望为

1*(1/(n+1)),去其他城市x期望为(1+d[x])*(1/(n+1))(花费一天在坐高铁上)。如果在本地玩了两天,第三天必须要走了期望为(1+d[x])*(1/n)*(1/(n+1))

#include<bits/stdc++.h>
using namespace std; 
const int mod=998244353;
typedef long long ll;
ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}
vector<int>g[100005];
ll d[100005];
int vis[100005];
void dfs(int u){
	if(vis[u])
		return ;
	vis[u]=1;
	d[u]=1;
	int sz=g[u].size();
	for(int i=0;i<sz;i++){
		int v=g[u][i];
		dfs(v);
		d[u]=(d[u]+(d[v]+1)*(inv(sz+1)+inv(sz+1)*inv(sz)%mod)%mod)%mod;
	}
	d[u]=(d[u]+inv(sz+1))%mod;
}
int main(){
	ios::sync_with_stdio(false);
	int T;
	cin>>T;
	while(T--){
		int n,m,u,v;
		cin>>n>>m;
		for(int i=1;i<=n;i++)
			g[i].clear(), vis[i] = 0;
		for(int i = 1;i <= m; i++){
			cin>>u>>v;
			g[u].push_back(v);
		}
		dfs(1);
		cout<<d[1]<<"\n";
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值