tarjan解決路徑詢問問題

2022-02-02 05:57:25 字數 1177 閱讀 1091

好久沒更新了,就更一篇普及組內容好了。

首先我們考慮如何用tarjan離線求出lca,偽**大致如下:

def

tarjan(x):

將x標記為已訪問

for c in

x的孩子:

tarjan(c)

將c所在並查集的父親置為x

for q in

關於x的詢問:

y=詢問q除了x外的另乙個端點

ify已訪問:

q的答案=y所在並查集的根

這樣為什麼是對的呢?考慮lca肯定是先搜到y,再搜到x,因為此時lca還沒有做完,所以此時並查集的根就是lca,而且y已經和lca並在一起了,所以會詢問到正確的結果。

現在我們要用tarjan來解決路徑詢問問題,例如每條邊有邊權,若干次詢問,詢問路徑上的邊權和。

首先我們要在並查集上動一些手腳,原來並查集只是用來查詢祖先,我們在並查集每個點上記乙個額外資訊,為這個點到並查集根的資訊,在本題中即為該點到根的邊權和。在查詢祖先時我們可以順便更新這個資訊。

查出lca時我們把這個詢問扔進lca,把它稱作「延遲詢問」,回到lca的時候遍歷所有延遲詢問,這時候x和y在並查集中的祖先都是lca,直接合併資訊即可。

ff=乙個初始為0的陣列儲存並查集 

info=乙個初始為空的陣列儲存資訊

deffind(x):

if!ff[x]:

return

x y=ff[x]

ff[x]=find(y)

info[x]=info[x]+info[y]

return

ff[x]

deftarjan2(x):

將x標記為已訪問

for c in

x的孩子:

tarjan2(c)

ff[c]=x

info[c]=c到x的邊的資訊

for q in

關於x的詢問:

y=詢問q除了x外的另乙個端點

ify已訪問:

q的lca=y所在並查集的根

在q的lca處插入延遲詢問q

for q in

x為lca的延遲詢問:

(a,b)=該詢問的兩個端點

find(a)

find(b)

q的詢問結果=info[a]+info[b]

解決github訪問問題

github這是個好地方。但是,上不去就蛋疼。今天github上不去,果斷f12下,看下network。發現裡面好多請求都是指向 github.global.ssl.fastly.net這個網域名稱的,然後請求都無法成功。想到了改hosts,於是cmd裡ping github.global.ssl....

我們怎麼問問題

吳旻泰巖網路工作室 老闆前些天找我談了一次,是關於研發團隊人員的能力問題。他提了兩個人,表示他們能力不強。老闆是屬於 眼觀六路 耳聽八方 的那種領導風格,因為是技術出身,所以一聽一看之間,就大體能得出靠譜的判斷。坦誠地說,被提到的同事還都是屬於實幹型的程式設計師,他們有其自身的優點 但實事求是地講,...

關於線段樹的區間修改與區間詢問問題

有一類問題,它們的大意都是維護一段序列,給出兩種操作,一種是對一段區間進行整體修改,一類是對一段區間詢問其中元素的極值或者和。這一類問題通常是使用線段樹來解的,然而,如果操作比較簡單,線段樹的實現也會有不同的方法,這裡以最簡單的一道題poj 3468為例。第一種方法 線段樹 lazy標記 我們使用l...