题目
https://cn.vjudge.net/problem/Gym-102174L
题意
一个人去旅行 当前城市有n条道路通往别的城市 他有1/(n+1)多停留一天 1/(n+1)去下一个城市,如果他停留了,那么他有1/n的去下一个城市
思路
树上期望 求他的子节点所有的期望,依次乘上去这个节点的概率
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e5+5;
ll kuai(ll n,ll m)
{
ll ans=1;
while(m)
{
if(m%2)
ans=ans*n%mod;
n=n*n%mod;
m/=2;
}
return ans;
}
vector<int>g[maxn];
ll ans;
ll dis[maxn];
void dfs(int now)
{
ll len=g[now].size();
ll pp = kuai(len+1,mod-2);
ll ppp = pp*kuai(len,mod-2)%mod;
if(now == 1) dis[now] = 1+pp;
else
dis[now] = 2+pp;
for(int i = 0; i < len; i++)
{
int v = g[now][i];
if(dis[v])
{
dis[now] = (dis[now] + (pp+ppp)*dis[v])%mod;
}
else
{
dfs(v);
dis[now] = (dis[now] + (pp+ppp)*dis[v])%mod;
}
}
}
int main()
{
int T,a,b,u,v;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&a,&b);
memset(dis,0,sizeof(dis));
for(int i=0; i<=a; i++)
g[i].clear();
for(int i=1; i<=b; i++)
{
scanf("%d %d",&u,&v);
g[u].push_back(v);
}
dfs(1);
printf("%lld\n",dis[1]);
}
return 0;
}
博客围绕一道题目展开,题目链接为https://cn.vjudge.net/problem/Gym - 102174L 。题意是一人旅行,当前城市有n条路通其他城市,有1/(n + 1)概率多停留一天或去下一个城市,停留后有1/n概率去下一个城市。解题思路是利用树上期望,求子节点期望并乘上去该节点的概率。
971

被折叠的 条评论
为什么被折叠?



