bzoj3640: JC的小蘋果

來源:互聯網
上載者:User

標籤:double   無法   content   複雜   期望   --   vector   can   一個   

Description

   讓我們繼續JC和DZY的故事。

    “你是我的小丫小蘋果,怎麼愛你都不嫌多!”

    “點亮我生命的火,火火火火火!”

    話說JC曆經艱辛來到了城市B,但是由於他的疏忽DZY偷走了他的小蘋果!沒有小蘋果怎麼聽歌!他發現邪惡的DZY把他的小蘋果藏在了一個迷宮裡。JC在經曆了之前的戰鬥後他還剩下hp點血。開始JC在1號點,他的小蘋果在N號點。DZY在一些點裡放了怪獸。當JC每次遇到位置在i的怪獸時他會損失Ai點血。當JC的血小於等於0時他就會被自動彈出迷宮並且再也無法進入。

    但是JC迷路了,他每次只能從當前所在點出發等機率的選擇一條道路走。所有道路都是雙向的,一共有m條,怪獸無法被殺死。現在JC想知道他找到他的小蘋果的機率。

    P.S.大家都知道這個系列是提高組類比賽,所以這是一道送分題balabala

Input

第一行三個整數表示n,m,hp。接下來一行整數,第i個表示jc到第i個點要損失的血量。保證第1個和n個數為0。接下來m行每行兩個整數a,b表示ab間有一條無向邊。

Output

    僅一行,表示JC找到他的小蘋果的期望機率,保留八位小數。

將圖按hp剩餘量分層,用f[a][w]表示hp剩餘a,當前在點w到達終點的機率

遞推式只與當前層和hp更小的層有關,預先處理對與當前層相關的部分構成的遞推矩陣求逆,於是可以O(n^2)轉移一層

時間複雜度O(n^3+n^2*hp)

#include<bits/stdc++.h>typedef double ld;int n,m,hp,vs[155];std::vector<int>es[155];ld f[10007][155],xs[155][155],ys[155],zs[155][155];void ae(int a,int b){    if(a==n)return;    ++xs[a][a];    if(vs[b])es[a].push_back(b);    else --xs[a][b];}int main(){    scanf("%d%d%d",&n,&m,&hp);    for(int i=1;i<=n;++i)scanf("%d",vs+i),zs[i][i]=1;    for(int i=0,a,b;i<m;++i){        scanf("%d%d",&a,&b);        ae(a,b);if(a!=b)ae(b,a);    }    xs[n][n]=1;    for(int i=1;i<=n;++i){        int w=i;        for(int j=i+1;j<=n;++j)if(fabs(xs[j][i])>fabs(xs[w][i]))w=j;        if(w!=i)        for(int j=1;j<=n;++j){            std::swap(xs[i][j],xs[w][j]);            std::swap(zs[i][j],zs[w][j]);        }        ld a=xs[i][i];        for(int j=1;j<=n;++j){            xs[i][j]/=a;            zs[i][j]/=a;        }        for(int j=1;j<=n;++j)if(j!=i){            a=xs[j][i];            for(int k=1;k<=n;++k){                xs[j][k]-=xs[i][k]*a;                zs[j][k]-=zs[i][k]*a;            }        }    }    for(int t=1;t<=hp;++t){        for(int i=1;i<n;++i){            ys[i]=0;            for(int j=0;j<es[i].size();++j){                int u=es[i][j];                if(vs[u]<t)ys[i]+=f[t-vs[u]][u];            }        }        ys[n]=1;        for(int i=1;i<=n;++i){            ld s=0;            for(int j=1;j<=n;++j)s+=zs[i][j]*ys[j];            f[t][i]=s;        }    }    printf("%.8f\n",f[hp][1]);    return 0;}

 

bzoj3640: JC的小蘋果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.