1. 程式人生 > >【bzoj1415】[Noi2005]聰聰和可可 期望記憶化搜索

【bzoj1415】[Noi2005]聰聰和可可 期望記憶化搜索

def 小數 所在 技術分享 alt tdi line 都是 包含

題目描述

技術分享

輸入

數據的第1行為兩個整數N和E,以空格分隔,分別表示森林中的景點數和連接相鄰景點的路的條數。 第2行包含兩個整數C和M,以空格分隔,分別表示初始時聰聰和可可所在的景點的編號。 接下來E行,每行兩個整數,第i+2行的兩個整數Ai和Bi表示景點Ai和景點Bi之間有一條路。 所有的路都是無向的,即:如果能從A走到B,就可以從B走到A。 輸入保證任何兩個景點之間不會有多於一條路直接相連,且聰聰和可可之間必有路直接或間接的相連。

輸出

輸出1個實數,四舍五入保留三位小數,表示平均多少個時間單位後聰聰會把可可吃掉。

樣例輸入

【輸入樣例1】
4 3
1 4
1 2
2 3

3 4
【輸入樣例2】
9 9
9 3
1 2
2 3
3 4
4 5
3 6
4 6
4 7
7 8
8 9

樣例輸出

【輸出樣例1】
1.500
【輸出樣例2】
2.167


題解

期望記憶化搜索

先預處理出兩個點之間的最短路,以及從那個點走來。

然後就是很水的期望dp。

設$f[i][j]$表示聰聰在$i$,可可在$j$時還要走的期望時間。

那麽顯然考慮$i$走兩步到達的點$t$,$f[i][j]=\frac{\sum\limits_{dis[j][k]\le 1}f[t][k]}{d[j]+1}$。

由於兩人距離一定是越來越小的,所以這個dp實際上是有序的(按照兩點距離從小到大)。為了不特殊處理順序,使用記憶化搜索就好了。

#include <queue>
#include <cstdio>
#include <algorithm>
#define N 1010
using namespace std;
queue<int> q;
int d[N] , head[N] , to[N << 1] , next[N << 1] , cnt , last[N][N] , dis[N][N];
double f[N][N];
void add(int x , int y)
{
    to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt , d[x] ++ ;
}
void bfs(int u)
{
    int x , i;
    last[u][u] = -1 , q.push(u);
    while(!q.empty())
    {
        x = q.front() , q.pop();
        for(i = head[x] ; i ; i = next[i])
        {
            if(!last[u][to[i]]) last[u][to[i]] = x , dis[u][to[i]] = dis[u][x] + 1 , q.push(to[i]);
            else if(dis[u][to[i]] == dis[u][x] + 1 && last[u][to[i]] > x) last[u][to[i]] = x;
        }
    }
}
double dfs(int x , int y)
{
    if(dis[x][y] == 0) return 0;
    if(f[x][y] > 0) return f[x][y];
    if(dis[x][y] <= 2) return f[x][y] = 1;
    int t = last[y][last[y][x]] , i;
    double ret = dfs(t , y) / (d[y] + 1);
    for(i = head[y] ; i ; i = next[i]) ret += dfs(t , to[i]) / (d[y] + 1);
    return f[x][y] = ret + 1;
}
int main()
{
    int n , m , p1 , p2 , x , y , i;
    scanf("%d%d%d%d" , &n , &m , &p1 , &p2);
    for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x);
    for(i = 1 ; i <= n ; i ++ ) bfs(i);
    printf("%.3lf\n" , dfs(p1 , p2));
    return 0;
}

【bzoj1415】[Noi2005]聰聰和可可 期望記憶化搜索