[NOI2005]聪聪与可可(期望dp)
生活随笔
收集整理的這篇文章主要介紹了
[NOI2005]聪聪与可可(期望dp)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:給一張無向圖,有一只貓和一只老鼠,貓每秒會向老鼠的方向移動兩個單位,若它們的距離為一,那么只會移動一個單位,老鼠會等概率向周圍移動一步或不動,求貓抓到老鼠的期望時(shí)間。
Solution
luoguAC第800題。
注意到貓的運(yùn)動之和貓的位置和老鼠的位置有關(guān),我們可以對其進(jìn)行預(yù)處理,注意若有多種方案的情況會向編號小的點(diǎn)移動。
然后發(fā)現(xiàn)貓和老鼠的距離一定是會減小的,不如記錄狀態(tài)進(jìn)行記憶化搜索,這樣轉(zhuǎn)移是不會出現(xiàn)環(huán)的。
Code
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #define N 1002 using namespace std; queue<int>q; const double eps=1e-10; int head[N],dis[N][N],tot,tag[N][N],n,m,s,t; bool vis[N]; double dp[N][N]; struct zzh{int n,to; }e[N<<1]; inline void add(int u,int v){e[++tot].n=head[u];e[tot].to=v;head[u]=tot; } double dfs(int s,int t){if(dp[s][t]>eps)return dp[s][t];if(s==t)return 0;int ss=tag[s][t];if(ss==t)return 1;ss=tag[ss][t];if(ss==t)return 1;double sum=0,ans=0;for(int i=head[t];i;i=e[i].n)ans+=dfs(ss,e[i].to),sum++;ans+=dfs(ss,t);ans=ans/(sum+1)+1;return dp[s][t]=ans; } int main(){scanf("%d%d%d%d",&n,&m,&s,&t);int u,v;for(int i=1;i<=m;++i){scanf("%d%d",&u,&v);add(u,v);add(v,u);} memset(dis,0x3f,sizeof(dis));memset(tag,0x3f,sizeof(tag));for(int i=1;i<=n;++i){dis[i][i]=0;q.push(i);while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int j=head[u];j;j=e[j].n){int v=e[j].to;if(dis[i][v]>dis[i][u]+1){dis[i][v]=dis[i][u]+1;if(!vis[v]){vis[v]=1;q.push(v);}}}}}for(int i=1;i<=n;++i)for(int k=1;k<=n;++k)for(int j=head[i];j;j=e[j].n)if(dis[i][k]==dis[i][e[j].to]+dis[e[j].to][k])tag[i][k]=min(e[j].to,tag[i][k]);printf("%.3lf",dfs(s,t));return 0; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/ZH-comld/p/9680865.html
總結(jié)
以上是生活随笔為你收集整理的[NOI2005]聪聪与可可(期望dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django --ORM常用的字段和参数
- 下一篇: 前端之css引入方式/长度及颜色单位/常