BZOJ3036: 绿豆蛙的归宿
【传送门:BZOJ3036】
简要题意:
给出一个有向无环图,并且保证每条路径的起点为1,终点为n,且每条边都有权值
如果从一个点能到达k个点,那么它将会有1/k的概率走其中一个点
求出从起点到终点的期望
题解:
期望DP,DFS逆推
参考代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> using namespace std; double f[110000]; struct node { int x,y,next;double d; }a[210000];int len,last[110000]; void ins(int x,int y,double d) { len++; a[len].x=x;a[len].y=y;a[len].d=d; a[len].next=last[x];last[x]=len; } int chu[210000]; bool v[110000]; int n; void dfs(int x) { if(x==n) return ; if(v[x]==false) v[x]=true; else return ; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; dfs(y); f[x]+=f[y]+a[k].d; } f[x]/=chu[x]; } int main() { int m; scanf("%d%d",&n,&m); len=0;memset(last,0,sizeof(last)); for(int i=1;i<=m;i++) { int x,y;double d; scanf("%d%d%lf",&x,&y,&d); ins(x,y,d);chu[x]++; } memset(v,false,sizeof(v)); dfs(1); printf("%.2lf\n",f[1]); return 0; }