版权声明:转载请注明出处 https://blog.csdn.net/qq_41593522/article/details/84501931
题意
有向图,等概率选择路径,问期望路径长
题解
概率Dp,f[i]表示i节点的期望路径长
因为Dp无后效性,所以反向建图,来一遍Toposort就好了
调试记录
没有反向建图
#include <cstdio>
#include <queue>
#define maxn 1000005
#define double long double
using namespace std;
struct node{
int to, next, l;
}e[maxn];
int n, m, tot = 0, index[maxn], head[maxn];
double p[maxn], f[maxn];
void addedge(int u, int v, int l){
e[++tot] = (node){v, head[u], l};
head[u] = tot;
}
queue <int> q;
void Topo(){
for (int i = 1; i <= n; i++) if (!index[i]) q.push(i);
while (q.size()){
int now = q.front(); q.pop();
for (int i = head[now]; i; i = e[i].next){
f[e[i].to] += (f[now] + e[i].l) / p[e[i].to];
if (!--index[e[i].to]) q.push(e[i].to);
}
}
}
int main(){
scanf("%d%d", &n, &m);
for (int x, y, l, i = 1; i <= m; i++){
scanf("%d%d%d", &x, &y, &l);
addedge(y, x, l); index[x]++; p[x]++;
}
Topo();
printf("%.2llf\n", f[1]);
return 0;
}