[cogs1065]绿豆蛙的归宿
1065. [Nescafe19] 綠豆蛙的歸宿
【題目描述】
給出一個(gè)有向無環(huán)的連通圖,起點(diǎn)為1終點(diǎn)為N,每條邊都有一個(gè)長(zhǎng)度。綠豆蛙從起點(diǎn)出發(fā),走向終點(diǎn)。
到達(dá)每一個(gè)頂點(diǎn)時(shí),如果有K條離開該點(diǎn)的道路,綠豆蛙可以選擇任意一條道路離開該點(diǎn),并且走向每條路的概率為 1/K 。
現(xiàn)在綠豆蛙想知道,從起點(diǎn)走到終點(diǎn)的所經(jīng)過的路徑總長(zhǎng)度期望是多少?
【輸入格式】
第一行: 兩個(gè)整數(shù) N M,代表圖中有N個(gè)點(diǎn)、M條邊
第二行到第 1+M 行: 每行3個(gè)整數(shù) a b c,代表從a到b有一條長(zhǎng)度為c的有向邊
【輸出格式】
從起點(diǎn)到終點(diǎn)路徑總長(zhǎng)度的期望值,四舍五入保留兩位小數(shù)。
【輸入樣例】
4 41 2 1 1 3 2 2 3 3 3 4 4
【輸出樣例】
?7.00
?
【數(shù)據(jù)范圍】
時(shí)間限制:1 s?? 內(nèi)存限制:128 MB
對(duì)于20%的數(shù)據(jù) ? N<=100
對(duì)于40%的數(shù)據(jù) ? N<=1000
對(duì)于60%的數(shù)據(jù) ? N<=10000
對(duì)于100%的數(shù)據(jù) ?N<=100000,M<=2*N
?
題解:
由于要講課所以回來補(bǔ)一下坑……這題是一道概率的入門題啊……
設(shè)f[i]為從i走到終點(diǎn)的期望步數(shù),顯然f[n]=0;
我們考慮期望的線性性,由某個(gè)點(diǎn)i走到終點(diǎn)的期望步數(shù)f[i]應(yīng)該等于Σ(f[j]+(j->i邊權(quán)/j點(diǎn)出度),j->i有邊)
我們建立反圖遞歸求,最后求出的f[1]即為所求。
代碼見下:
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 const int N=100000; 6 int n,m,e; 7 queue<int>q; 8 int rudu[N+100],tmp[N+100],chudu[N+100],adj[N+100]; 9 double f[N+100]; 10 struct node{int zhong,next;double val;}s[N*2+100]; 11 inline void add(int qi,int zhong,double val) 12 { 13 s[++e].zhong=zhong;s[e].val=val; 14 s[e].next=adj[qi];adj[qi]=e; 15 } 16 int main() 17 { 18 //freopen("Lex.txt","r",stdin); 19 freopen("ldfrog.in","r",stdin); 20 freopen("ldfrog.out","w",stdout); 21 scanf("%d%d",&n,&m); 22 int a,b;double c; 23 for(int i=1;i<=m;i++) 24 scanf("%d%d%lf",&a,&b,&c),rudu[a]++,chudu[b]++,add(b,a,c); 25 q.push(n); 26 for(int i=1;i<=n;i++)tmp[i]=rudu[i]; 27 while(!q.empty()) 28 { 29 int rt=q.front();q.pop(); 30 for(int i=adj[rt];i;i=s[i].next) 31 { 32 int u=s[i].zhong;tmp[u]--; 33 f[u]+=(f[rt]+s[i].val)/rudu[u]; 34 if(tmp[u]==0)q.push(u); 35 } 36 } 37 printf("%.2lf",f[1]); 38 } COGS1065?
轉(zhuǎn)載于:https://www.cnblogs.com/LadyLex/p/7171567.html
總結(jié)
以上是生活随笔為你收集整理的[cogs1065]绿豆蛙的归宿的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一早间新闻~20170717
- 下一篇: Redis之List类型操作