[Noip模拟题]绿豆蛙的归宿
来源:互联网 发布:最好软件培训学校 编辑:程序博客网 时间:2024/04/29 09:05
Description
给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度。绿豆蛙从起点出发,走向终点。到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?
Input
第一行: 两个整数 N M,代表图中有N个点、M条边
第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边
N<=100000,M<=2*N
Output
从起点到终点路径总长度的期望值,四舍五入保留两位小数。
Sample Input
4 4
1 2 1
1 3 2
2 3 3
3 4 4
Sample Output
7.00
HINT
思路
就是一个概率期望dp+dfs,每个点的值由它的儿子节点转移过来,方程为:
代码
#include <cstdio>const int maxn=100000;int n,m;double f[maxn+10];int pre[(maxn<<1)+10],now[(maxn<<1)+10],son[(maxn<<1)+10],tot,val[(maxn<<1)+10];int ins(int a,int b,int c){ tot++; pre[tot]=now[a]; now[a]=tot; son[tot]=b; val[tot]=c; return 0;}double dfs(int u){ if(f[u]!=0) { return f[u]; } if(u==n) { return 0; } int sum=0,j=now[u]; while(j) { int v=son[j]; sum++; f[u]+=dfs(v)+val[j]; j=pre[j]; } if(sum) { f[u]/=sum; } return f[u];}int main(){ scanf("%d%d",&n,&m); for(int i=1; i<=m; i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); ins(a,b,c); } dfs(1); printf("%.2lf\n",f[1]); return 0;}
阅读全文
0 0
- [Noip模拟题]绿豆蛙的归宿
- 【NOIP2013模拟】绿豆蛙的归宿
- 绿豆蛙的归宿
- 绿豆蛙的归宿
- 【bzoj3036】绿豆蛙的归宿
- bzoj3036 绿豆蛙的归宿
- bzoj3036 绿豆蛙的归宿
- BZOJ3036 绿豆蛙的归宿
- 3036: 绿豆蛙的归宿
- 【bzoj3036】绿豆蛙的归宿
- Codevs2488绿豆蛙的归宿
- [codevs2488]绿豆蛙的归宿
- BZOJ3036 绿豆蛙的归宿
- 【BZOJ3036】绿豆蛙的归宿 概率DP
- BZOJ 3036 绿豆蛙的归宿
- Tyvj P1933 绿豆蛙的归宿
- tyvj 1933 绿豆蛙的归宿
- 2488 绿豆蛙的归宿[难以自拔]
- 手慢无 | 年薪30万也离职学的Linux运维课?到底教什么?
- Java多线程知识-笔记三
- 几种可以让元素水平垂直居中的方法
- 机器学习Chapter3-(聚类分析)聚类简介
- c#语言-正方形,圆形,利用接口实现周长及面积的计算
- [Noip模拟题]绿豆蛙的归宿
- 顺序查找,拆半查找。
- 双链表
- python 格式输出
- 山上的国度(图论相关)
- Sublime Text 3常用插件以及安装方法
- AOT,JIT区别,各自优劣,混合编译
- call 和 apply 的使用讨论
- Boost 协程