![](/img/trans.png)
[英]Linear algorithm to find two points with at least half diameter distance in a point set
[英]Algorithm to find any two nodes with distance of at least half the (undirected) graph's diameter
我必須給出一個算法如下:
給定一個無向連通圖 G,給出一個算法,找到兩個節點 x,y,使得它們的距離至少是圖直徑的一半。 證明任何主張。
我假設我必須從任意節點運行 BFS 並找到最遠的節點來找到直徑。 然后找到兩個探索的節點,其距離大於直徑的一半。 但我懷疑這是最佳的並要求解決方案。 有沒有其他方法可以在運行 BFS 時找到直徑,同時找到這兩個所需的節點? 這樣復雜度仍然是多項式。 任何指導或提示將不勝感激!
圖的直徑(我們稱之為D
)是其任何節點之間的最大距離(= 最小跳數)。
選擇任何節點並執行 BFS,同時為每個節點保留初始節點的跳數。 這需要 O(V),因為您將只訪問所有節點一次。 請注意,這個number of hops
也是shortest distance to v from the root
的shortest distance to v from the root
- 我將其稱為d(root, v)
。
現在,從根中取出跳數最多的葉子z
。 恭喜, d(root, z) >= D/2
,因為
引理:對於直徑為D
的連通圖中的任何節點x
,必須存在一個距離至少D/2
遠的節點y
。
證明:如果不是這樣,那么會有一些節點x
因此對於所有y
, d(x,y) = D/2 - k <= D/2
( k>=1
)。 但是,通過通過x
,我們可以找到從任何節點到所有其他節點的路徑最多為2 * (D/2 - k) = D - 2k
- 因此,圖的直徑不能是D
,而是D - 2k
.
這實際上是一個棘手的問題,但我想我明白了。 有趣的是,您部分錯誤的解決方案讓我走上了正確的道路。
讓我們在這里復制幾個定義:
v
的偏心率是v
與任何其他頂點之間的最大距離d
是圖中任意頂點的最大偏心率。 也就是說, d
是任何一對頂點之間的最大距離真正的問題是實際找到直徑,這不是一件容易的事。 要找到直徑,您不能只選擇任何節點並運行 BFS - 在這種情況下,您只需找到與該節點距離(偏心率)最大的節點,但它不是直徑。 要實際找到直徑,您必須從每個節點運行 BFS(= 查找偏心率),並且您獲得的最高距離是直徑(有一些更好的算法,但正如我所說 - 這不是簡單的任務)。
然而! 您根本不必知道直徑。 如果您實際上從隨機節點運行 BFS 並找到距離(偏心率)最高的節點 - 這就是您的算法的解決方案。 x
將是您的起始節點, y
將是距離最大的節點。
為什么? 如果你想象這樣的超級簡單的圖形
您可以看到直徑在節點 1 和節點 4 之間。因此,無論您從哪個點運行 BFS,該點都必須位於中間(這意味着它將具有直徑的一半)或不在中間,並且那么距離最大的節點的距離必須比直徑的一半還要高。
如果您選擇 6 或 7,它的直徑路徑不完全(因為最大距離在 1-2-3-4-5 之間),但這意味着您獲得更高的距離,這對您的任務來說很好。
結果:從隨機節點運行BFS,當它結束時,取與起始節點距離最大的節點(=找到偏心並記住最遠的節點),起始和“結束”節點是(x,y)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.