日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

[NOI2005]聪聪与可可(期望dp)

發(fā)布時(shí)間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。