期望dp。类似记忆化搜索的方法实现。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 100500 #define maxe 200500 using namespace std; struct edge { int v,w,nxt; }e[maxe]; int n,m,x,y,z,g[maxv],nume=1,d[maxv]; double dp[maxv]; bool vis[maxv]; void addedge(int u,int v,int w) { e[++nume].v=v;e[nume].w=w; e[nume].nxt=g[u];g[u]=nume; } void dfs(int x) { vis[x]=true; for (int i=g[x];i;i=e[i].nxt) { int v=e[i].v; if (!vis[v]) dfs(v); dp[x]+=dp[v]+e[i].w; } if (d[x]) dp[x]=dp[x]/d[x]; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); addedge(x,y,z);d[x]++; } dfs(1); printf("%.2lf\n",dp[1]); return 0; }