昆明做网站建设公司/创意设计
LINK
题意
一张有向无环图,你从111号点出发
每天会随机走相邻的点或停在当前格子,花费为当前已走天数
求到达nnn号点的期望花费。
要知道花费,就必须知道当前是第几天,这显然是不现实的。
不妨定义f[i]f[i]f[i]表示当前在点iii,到达nnn还需要的期望天数
再定义g[i]g[i]g[i]表示当前再点iii,到达nnn的期望花费
设iii有k−1k-1k−1个点可以转移,那么有转移方程
f[i]=1k∗∑(i,v)f[v]+1k∗f[i]+1f[i]=\frac{1}{k}*\sum\limits_{(i,v)}f[v]+\frac{1}{k}*f[i]+1f[i]=k1∗(i,v)∑f[v]+k1∗f[i]+1
化简得到f[i]=1k−1∑(i,v)f[v]+kk−1f[i]=\frac{1}{k-1}\sum\limits_{(i,v)}f[v]+\frac{k}{k-1}f[i]=k−11(i,v)∑f[v]+k−1k
那么递推ggg就方便了
g[i]=1k∗∑(i,v)(g[v]+f[v])+1k∗(g[i]+f[i])+1g[i]=\frac{1}{k}*\sum\limits_{(i,v)}(g[v]+f[v])+\frac{1}{k}*(g[i]+f[i])+1g[i]=k1∗(i,v)∑(g[v]+f[v])+k1∗(g[i]+f[i])+1
化简得到g[i]=1k−1∗∑(i,v)∗(g[v]+f[v])+1k−1∗f[i]+kk−1g[i]=\frac{1}{k-1}*\sum\limits_{(i,v)}*(g[v]+f[v])+\frac{1}{k-1}*f[i]+\frac{k}{k-1}g[i]=k−11∗(i,v)∑∗(g[v]+f[v])+k−11∗f[i]+k−1k
最后g[1]g[1]g[1]就是答案。
有点类似费用提前的思想吧。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
vector<int>vec[maxn];
int t,n,m,vis[maxn];
double f[maxn],g[maxn];
void dfs(int u)
{f[u] = g[u] = 0;if( u==n ) return; //终点 vis[u] = 1; int k = 1;for(auto v:vec[u] ){if( vis[v]==0 ) dfs(v); k++;f[u] += f[v];g[u] += g[v]+f[v];}f[u] = ( f[u]+k )/(k-1.0);g[u] = ( g[u]+f[u]+k )/(k-1.0);
}
int main()
{cin >> t;while( t-- ){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int l,r; scanf("%d%d",&l,&r);vec[l].push_back( r );}dfs(1);printf("%.2f\n",g[1] );for(int i=1;i<=n;i++) vec[i].clear(),vis[i] = 0;}
}