可以先預處理出當聰聰在 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[p
[i,j
],j]
,j]t
[i]+
1 然後記憶化搜尋。
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 1000000000
#define n 1005
#define d double
using
namespace
std;
int n,m,siz,s,t;
int first[n],next[n*2],to[n*2];
int p[n],d[n],map[n][n],trans[n][n];
d f[n][n];
void inser(int x,int y)
void bfs(int s)
}void init()
memset(map,-1,sizeof(map));
for (int i=1;i<=n;i++) bfs(i);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) if (i^j)
for (int y,k=first[i];k;k=next[k])
if (map[trans[i][j]][j]>map[y=to[k]][j]||map[trans[i][j]][j]==map[y][j]&&yint x,int y)
int main()
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...
BZOJ1415 Noi2005 聰聰和可可
資料的第1行為兩個整數n和e,以空格分隔,分別表示森林中的景點數和連線相鄰景點的路的條數。第2行包含兩個整數c和m,以空格分隔,分別表示初始時聰聰和可可所在的景點的編號。接下來e行,每行兩個整數,第i 2行的兩個整數ai和bi表示景點ai和景點bi之間有一條路。所有的路都是無向的,即 如果能從a走到...