【BZOJ】3036 绿豆蛙的归宿 期望DP

来源:互联网 发布:java 设置特定时间 编辑:程序博客网 时间:2024/04/30 02:28

题目传送门

补一发期望DP,这道题困扰了我很久了,今天终于A掉了,比较开心:)

f[i]=json[i]f[j]+dis(i,j)deg[i]

上面就是整道题的核心,只要从第一个节点开始DFS就行了。

附上AC代码:

#include <cstdio>#include <cctype>#define N 100010using namespace std;struct side{int to,w,nt;}s[N<<1];int n,m,x,y,w,h[N],num,dig[N];double ans[N];bool b[N];inline char nc(){static char ch[100010],*p1=ch,*p2=ch;return p1==p2&&(p2=(p1=ch)+fread(ch,1,100010,stdin),p1==p2)?EOF:*p1++;}inline void read(int& a){static char c=nc();int f=1;for (;!isdigit(c);c=nc()) if (c=='-') f=-1;for (a=0;isdigit(c);a=a*10+c-'0',c=nc());a*=f;return;}inline void add(int x,int y,int w){s[++num]=(side){y,w,h[x]},h[x]=num,++dig[x];}inline void so(int x){if (!b[x]) b[x]=1; else return;for (int i=h[x]; i; i=s[i].nt)so(s[i].to),ans[x]+=s[i].w+ans[s[i].to];if (dig[x]) ans[x]/=dig[x];return;}int main(void){read(n),read(m);for (int i=1; i<=m; ++i) read(x),read(y),read(w),add(x,y,w);so(1),printf("%.2lf",ans[1]);return 0;}

原创粉丝点击