description
題解 既然是平均情況,顯然就是求數學期望。我們會發現,每乙個時刻貓鼠之間的最短路徑一定是減小了,所以不會出現轉圈的情況,所以可以用記憶化搜尋,用f[
x][y
] 表示貓在節點x,鼠在節點y,貓鼠相遇的期望值。題目中最終要的就是要知道貓的下一步會走到**,可以列舉每個點,然後bfs刷最短路,最後列舉一下,o(
n2) 的複雜度就可以構造出來。所以轉移方程:f[
x][y
]=1+
∑dp(
nxt,
son[
j])d
egre
e[y]
+1其中nxt表示貓下一步走到的節點。顯然,如果x=y,f[
x][y
] =0,如果貓走的時候已經抓到了老鼠,那麼f[
x][y
]=1 ;
給出**:
#include
#include
#include
#define maxn 1006
using
namespace
std;
int n,e,p1,p2,tot,lnk[maxn],son[maxn*2],nxt[maxn*2],ent[maxn],dis[maxn],que[maxn],
p[maxn][maxn];
bool vis[maxn];
double inf,f[maxn][maxn];
int _read()
void add(int x,int y)
void bfs(int x)
}}double dp(int x,int y)
if(f[x][y]!=inf)return f[x][y];
if(p[x][y]==y)return f[x][y]=1;
if(p[p[x][y]][y]==y)return f[x][y]=1;
f[x][y]=1;
f[x][y]+=dp(p[p[x][y]][y],y)/(ent[y]+1);
for(int j=lnk[y];j;j=nxt[j])if(son[j]!=x)
if(p[x][son[j]]!=son[j]) f[x][y]+=dp(p[p[x][y]][y],son[j])/(ent[y]+1);
return f[x][y];
}int main()
bzoj 1415 聰聰和可可 期望
可以先預處理出當聰聰在 i 點,可可在 j 點時,聰聰下一步到達的點的編號,記為p i,j bfs即可。設f i,j 表示聰聰在 i,可可在 j 時的期望步數,w i,j 為與i相鄰的第 j 個點編號,t i 為 i 點的度數,則有f i,j t i k 1f p p i j j w j,k f p...
BZOJ 1415 聰聰和可可 期望DP
我們可以用n次bfs預處理出 to陣列,to i j 表示聰聰從i點到j點第一步會走哪個點。那麼對於聰聰在i點,可可在j點,聰聰先走,定義dp i j 表示步數期望。那麼顯然有dp i j sigma dp p w dp p j dee j 1 1.其中p表示to to i j j w表示j點鄰接的...
bzoj1415 聰聰和可可
對於任意一對位置x,y我們可以找到聰聰的行走方案。這個可以bfs跑 然後我們用f x,y 表示聰聰在x,可可在y抓住的期望時間,於是轉移方程是 if x y f x y 0,if x走兩步能到y f x y 1,else f x y sigma f x nxtpos y nxtpos 1 d y 1...