洛谷 #4316. 綠豆蛙的歸宿
阿新 • • 發佈:2018-11-26
題意
有向圖,等概率選擇路徑,問期望路徑長
題解
概率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;
}