题意
传送门 P4316 绿豆蛙的归宿
题解
设
F
i
F_i
Fi 为从节点
i
i
i 走到终点所经过的路径总长度期望,设节点
i
i
i 的出度为
d
e
g
i
deg_i
degi,那么有
F
i
=
1
d
e
g
i
∑
e
(
i
,
j
)
∈
E
(
w
i
j
+
F
j
)
F_i=\frac{1}{deg_i}\sum\limits_{e(i,j)\in E}(w_{ij}+F_j)
Fi=degi1e(i,j)∈E∑(wij+Fj) 构造反图,求拓扑序
D
P
DP
DP 即可。
#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
struct edge
{
int v, w;
};
vector<edge> G[maxn];
int deg[maxn], _deg[maxn];
double F[maxn];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; ++i)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
G[v].push_back(edge{u, w});
++deg[u];
}
memcpy(_deg, deg, sizeof(int) * (n + 1));
queue<int> q;
for (int i = 1; i <= n; ++i)
if (deg[i] == 0)
q.push(i);
F[n] = 0;
while (!q.empty())
{
int v = q.front();
q.pop();
for (int i = 0; i < (int)G[v].size(); ++i)
{
edge &e = G[v][i];
F[e.v] += (e.w + F[v]) / deg[e.v];
if (--_deg[e.v] == 0)
q.push(e.v);
}
}
printf("%.2f\n", F[1]);
}