2015-11-06 56 views
2

我的問題非常直截了當。樹中兩個節點之間的距離加權

甲加權樹中給出。我們必須找到兩個給定節點之間的距離。

因爲每次bfs超時,查詢次數非常高(約75000),所以我嘗試了不同的方式來做到這一點。

我的算法是這樣的:

  • 我跑從頂點0 DFS和根計算的距離(0)所有頂點這樣的事情

    depth[v]=depth[u]+w,where u is parent of v and w is weight b/w (u,v) 
    
  • 一旦我計算所有節點的深度都使用dfs和每個節點的第2個父節點(假設我知道該怎麼做)。我計算了LCA爲(u,v)詢問了每個查詢。

  • 然後我計算方法爲距離這樣

    distance between (u,v)=depth[u]+depth[v]-2*depth[lca(u,v)] 
    

但如預期,我沒有得到正確的判決。 是我的算法正確的還是我失去了一些重要的 .Guidance需要:)

詩櫃面任何人希望看到我實現鏈路http://paste.ubuntu.com/13129038/

回答

1

你的方法聽起來很合理,但是看着鏈接的代碼,我建議你嘗試一個小例子(例如樹中有3個節點)並仔細檢查父數組的內容。

據我可以看到,唯一的線路改變父陣列的內容是:

memset(parent,-1,sizeof parent); 

parent[i][j]=parent[i-1][parent[i-1][j]] 

因此相信父的內容將總是等於-1 。

也許需要一個鹼情況下設置父[0] [j]的等於j的父?

而且,它不是你是否使用深度是指邊的數量,或所有邊的權重之和的計數從代碼很清楚。爲了計算距離,您需要一個權重總和,但要使LCA算法起作用,您可能會發現需要使用邊數。

+0

喜先生,我剛纔看到我忽略父陣列的基本情況十分感謝這一點,但它仍然沒有得到正確的可能是一些其他犯錯誤發現問題這個正確的解決辦法,但我不明白爲什麼我錯了還是我的算法是錯誤的,你可以幫助看到這個http://paste.ubuntu.com/13129663/ –

+0

嗨,先生,謝謝你的時間。我終於解決了這個問題。我正在做的一個實際的錯誤是計算LCA的重量是垃圾。我使用另一個陣列作爲節點深度並計算LCA(愚蠢的我:p)。感謝您的時間(實現-http://paste.ubuntu.com/13142974/)+1。 –