【期望】路径长度(金牌导航 期望-1)
生活随笔
收集整理的這篇文章主要介紹了
【期望】路径长度(金牌导航 期望-1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
路徑長度
金牌導航 期望-1
題目大意
給出一個圖,問你從1走到n的期望路徑長度
輸入樣例
4 4 1 2 1 1 3 2 2 3 3 3 4 4輸出樣例
7.00數據范圍
1?n?1051\leqslant n \leqslant 10^51?n?105
1?m?2×n1\leqslant m\leqslant 2\times n1?m?2×n
1?u,v?n1\leqslant u,v\leqslant n1?u,v?n
1?w?1091\leqslant w\leqslant 10^91?w?109
數據保證給出的圖無重邊和自環
解題思路
設f_x為經過x的期望次數
那么有
f1=1f_1=1f1?=1
feto=fxdegxf_{eto}=\frac{f_x}{deg_x}feto?=degx?fx??
然后用點的期望經過次數得出邊的期望經過次數
然后乘上長度即可
代碼
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 100010 using namespace std; int n, m, x, y, z, tot, head[N], indeg[N], outdeg[N]; double ans, f[N]; struct rec {int l, to, next; }a[2*N]; void add(int x, int y, int z) {a[++tot].to = y;a[tot].next = head[x];a[tot].l = z;head[x] = tot;outdeg[x]++;indeg[y]++; } void solve() {queue<int>d;d.push(1);f[1] = 1.0;while(!d.empty()){int h = d.front();d.pop();for (int i = head[h]; i; i = a[i].next){f[a[i].to] += f[h] / outdeg[h];//期望經過次數indeg[a[i].to]--;ans += f[h] /outdeg[h] * a[i].l;//計算貢獻if (!indeg[a[i].to]) d.push(a[i].to);}}return; } int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= m; ++i){scanf("%d%d%d", &x, &y, &z);add(x, y, z);}solve();printf("%.2lf", ans);return 0; }總結
以上是生活随笔為你收集整理的【期望】路径长度(金牌导航 期望-1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩魔兽的电脑配置要求高吗(玩魔兽的电脑配
- 下一篇: 【期望】乘坐电梯(金牌导航 期望-2)