Jzoj4890 隨機遊走

2022-05-09 16:11:11 字數 1960 閱讀 7554

今天切了一道期望dp的難(shui)題,寫寫這一道更難的題

yjc最近在學習圖的有關知識。今天,他遇到了這麼乙個概念:隨機遊走。隨機遊走指每次從相鄰的點中隨機選乙個走過去,重複這樣的過程若干次。yjc很聰明,他很快就學會了怎麼跑隨機遊走。為了檢驗自己是不是歐洲人,他決定選一棵樹,每條邊邊權為1,選一對點s和t,從s開始隨機遊走,走到t就停下,看看要走多長時間。但是在走了10000000步之後,仍然沒有走到t。yjc堅信自己是歐洲人,他認為是因為他選的s和t不好,即從s走到t的期望距離太長了。於是他提出了這麼乙個問題:給一棵n個點的樹,問所有點對(i,j)(1≤i,j≤n)中,從i走到j的期望距離的最大值是多少。yjc發現他不會做了,於是他來問你這個問題的答案。

這個比今天的期望dp難多了,當時剛剛見到題直接懵逼

後來看著facico巨神的solution才漸漸搞明白了

簡單說一說

我們假設f[x]為x走到父親的期望步數,g[x]為父親走到x的期望步數,d[x]為x的度數

我們可以列出乙個方程:f[x]=1/d[x]+(1/d[x])*σ(f[x]+f[v]+1)

解釋一下,x隨機遊走有兩種情況,一種是直接走到父親,代價為1,一種是走到兒子再走到父親

讓後做化簡可以得到(1/d[x])f[x]=1+(1/d[x])*σ(f[v])

所以 f[x]=d[x]+σf[v]

讓後列出關於g[x]的方程,設p為x的父親:

g[x]=1/d[p]+(1/d[p])*σ(f[v]+g[x]+1)+(

1/d[p])*(g[p]+g[x]+1)

p遊走有三種情況,直接到x,到了v走回來再到x,到了p的父親在走回來在走到x

化簡得到g[x]=d[p]+σf[v]

+g[p]

然而我們有f,g並沒有什麼卵用

我們還需要求出期望距離最長的路徑

這個和求樹的直徑有點像(然而並不能dfs求)

我們對於每個子樹,求出f,g的最長鏈和次長鏈

我們令df[x],rf[x]表示x所有子樹v中f期望最長,次長的距離

dg[x]和rg[x]類似,是g期望最長距離

顯然,df[x]=max(df[v]+f[v]),dg=max(dg[v]+g[v])

那麼最後統計經過x的期望最長路徑時就可以那dg和df加起來(如果同屬於乙個子樹那就拿次長)

(z注意,本題期望沒有要求取模,因為有一點是顯然的,期望步數肯定是個整數!)

#include

#include

#define n 100010

using

namespace

std;

struct edge g[n*2];

long

long s[n],f[n],g[n],df[n],dg[n],rf[n],rg[n],ans=0;

int vf[n],vg[n],h[n],d[n],n,c=0;

inline

void adj(int x,int y); h[x]=c;

}void dfs(int x,int p)

f[x]=s[x]+d[x];

}void dgs(int x,int p)

}void dijk(int x,int p) else

if(f[v]+df[v]>rf[x]) rf[x]=f[v]+df[v];

if(g[v]+dg[v]>dg[x]) else

if(g[v]+dg[v]>rg[x]) rg[x]=g[v]+dg[v];

} if(vf[x]!=vg[x]) ans=max(ans,df[x]+dg[x]);

else ans=max(ans,max(df[x]+rg[x],dg[x]+rf[x]));

}int main()

dfs(1,0);

dgs(1,0);

dijk(1,0);

printf("%lld.00000\n",ans);

}

jzoj4890 隨機遊走

給出一棵樹,邊權為一,乙個點走到相鄰點的概率相等,求一對點對期望最多走多少步能到達。可以推出走過一條邊的期望,考慮lca為i的路徑貢獻,找到走到i和從i出發不同子樹和最遠的路徑,和答案取max即可。include include include define ll long long define ...

初識隨機遊走

隨機遊走 random walk 又稱隨機游動或隨機漫步。在我們生活中處處都存在著與random walk有關的自然現象,例如氣體分子的運動,滴入水中的墨水,氣味的擴散等 如圖1.4 random walk是擴散過程的基礎,因此它被廣泛地用於對物理和化學等擴散現象的模擬上。此外,random wal...

064 隨機遊走

隨機遊走模擬 模擬醉漢隨機遊走,醉漢的起點在 25 25 並且在周圍徘徊 include irvine32.inc walkmax 50startx 25starty 25 定義結構體 drunkardwalk struct path coord walkmax dup 0,0 pathsused ...