旅行的意义

旅行的意义

题意:天天在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";
	}
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值