TYVJ 1933 綠豆蛙的歸宿(概率dp)

2021-09-16 12:19:28 字數 1428 閱讀 3440

「poetize3」

給出乙個有向無環圖,起點為1終點為n,每條邊都有乙個長度,並且從起點出發能夠到達所有的點,所有的點也都能夠到達終點。綠豆蛙從起點出發,走向終點。 到達每乙個頂點時,如果有k條離開該點的道路,綠豆蛙可以選擇任意一條道路離開該點,並且走向每條路的概率為 1/k 。 現在綠豆蛙想知道,從起點走到終點的所經過的路徑總長度期望是多少?

輸入格式:

第一行: 兩個整數 n m,代表圖中有n個點、m條邊 第二行到第 1+m 行: 每行3個整數 a b c,代表從a到b有一條長度為c的有向邊

輸出格式:

從起點到終點路徑總長度的期望值,四捨五入保留兩位小數。

輸入樣例#1:複製

4 4 

1 2 1

1 3 2

2 3 3

3 4 4

輸出樣例#1:複製

7.00
對於20%的資料 n<=100

對於40%的資料 n<=1000

對於60%的資料 n<=10000

對於100%的資料 n<=100000,m<=2*n

思路:概率dp,設狀態dp【x】表示從x出發到達終點的期望距離。則有狀態轉移方程:

然後反向拓撲dp遞推答案。

ac**:

/**wjvje**/

#include #include #include #include #include #include#include #include #include #include#include#include/** -?£- **/

#define ll long long

#define par pair#define inf 0x3f3f3f3f

#define io ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);

using namespace std;

const int n=2e5+100;

const int m=2e5+100;

int head[n];

int next[m];

int edge[m];

int ver[m];

int deg[n];

int in[n];

int tot;

void add(int x,int y,int z)

double dp[n];

void topsort(int n) }}

int main()

topsort(n);

printf("%.2lf\n",dp[1]);

}return 0;

}

the end;

綠豆蛙的歸宿

綠豆蛙的歸宿 time limit 10000ms memory limit 165536k total submit 3 accepted 1 case time limit 1000ms description 給出乙個有向無環的連通圖,起點為1終點為n,每條邊都有乙個長度。綠豆蛙從起點出發,走...

綠豆蛙的歸宿

兩種方法,正推和逆推 逆推 dp i 表示從 i 到 n 的期望,方程的轉移 對於一條從 x 到 y 邊 dp x sum limits dp y edge i oud x 正推 dp i 表示從 1 到 i 的期望,g i 表示從 1 到 i 的概率,方程的轉移 對於一條從 x 到 y 的邊 dp...

綠豆蛙的歸宿

link emm,題目本身並不見得很難,主要是有乙個點必須理清楚。期望dp的計算需要遵守全期望公式,大概是 e sum limits i m p i times c i 也就是說你在搞清楚乙個東西對於期望的貢獻的同時還應該要知道它產生貢獻的概率。這也就回答了為什麼本題中只能逆推而不能順推的問題。畢竟...