[cogs1065]绿豆蛙的归宿
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                [cogs1065]绿豆蛙的归宿
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                1065. [Nescafe19] 綠豆蛙的歸宿
【題目描述】
給出一個有向無環的連通圖,起點為1終點為N,每條邊都有一個長度。綠豆蛙從起點出發,走向終點。
到達每一個頂點時,如果有K條離開該點的道路,綠豆蛙可以選擇任意一條道路離開該點,并且走向每條路的概率為 1/K 。
現在綠豆蛙想知道,從起點走到終點的所經過的路徑總長度期望是多少?
【輸入格式】
第一行: 兩個整數 N M,代表圖中有N個點、M條邊
第二行到第 1+M 行: 每行3個整數 a b c,代表從a到b有一條長度為c的有向邊
【輸出格式】
從起點到終點路徑總長度的期望值,四舍五入保留兩位小數。
【輸入樣例】
4 41 2 1 1 3 2 2 3 3 3 4 4
【輸出樣例】
?7.00
?
【數據范圍】
時間限制:1 s?? 內存限制:128 MB
對于20%的數據 ? N<=100
對于40%的數據 ? N<=1000
對于60%的數據 ? N<=10000
對于100%的數據 ?N<=100000,M<=2*N
?
題解:
由于要講課所以回來補一下坑……這題是一道概率的入門題啊……
設f[i]為從i走到終點的期望步數,顯然f[n]=0;
我們考慮期望的線性性,由某個點i走到終點的期望步數f[i]應該等于Σ(f[j]+(j->i邊權/j點出度),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?
轉載于:https://www.cnblogs.com/LadyLex/p/7171567.html
總結
以上是生活随笔為你收集整理的[cogs1065]绿豆蛙的归宿的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 求一早间新闻~20170717
 - 下一篇: Redis之List类型操作