绿豆蛙的归宿
作者:互联网
问题 S: 绿豆蛙的归宿
时间限制: 1 Sec 内存限制: 128 MB提交: 5 解决: 3
[提交] [状态] [讨论版] [命题人:admin]
题目描述
随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度。绿豆蛙从起点出发,走向终点。
到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。
现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?
输入
第一行: 两个整数 N M,代表图中有N个点、M条边第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边
输出
从起点到终点路径总长度的期望值,四舍五入保留两位小数。
样例输入
4 4 1 2 1 1 3 2 2 3 3 3 4 4
样例输出
7.00
提示
对于20%的数据 N<=100
对于40%的数据 N<=1000
对于60%的数据 N<=10000
对于100%的数据 N<=100000,M<=2*N
思路:记录出度,深搜+简单期望dp
#include<bits/stdc++.h> #include<vector> using namespace std; const int maxn=1e5+5; int n,m,p[maxn],vis[maxn],head[maxn],cnt; double dp[maxn]; struct node{ int v,w,next; }q[2*maxn]; void add(int u,int v,int w){ q[++cnt].v=v,q[cnt].w=w,q[cnt].next=head[u],head[u]=cnt; } void dfs(int cur){ if(cur==n)return; if(vis[cur])return; vis[cur]=1; for(int i=head[cur];i;i=q[i].next){ int t=q[i].v; dfs(t); dp[cur]+=(dp[t]+q[i].w)/p[cur]; } } int main() { cin>>n>>m; for(int i=1;i<=m;i++){ int x,y,z; cin>>x>>y>>z; p[x]++; add(x,y,z); } dfs(1); printf("%.2f",dp[1]); }
标签:cnt,归宿,cur,int,绿豆蛙,maxn,dp 来源: https://www.cnblogs.com/czy-power/p/10361472.html