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