簡體   English   中英

找到距離至少為(無向)圖直徑一半的任何兩個節點的算法

[英]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 rootshortest distance to v from the root - 我將其稱為d(root, v)

現在,從根中取出跳數最多的葉子z 恭喜, d(root, z) >= D/2 ,因為

引理:對於直徑為D的連通圖中的任何節點x ,必須存在一個距離至少D/2遠的節點y

證明:如果不是這樣,那么會有一些節點x因此對於所有yd(x,y) = D/2 - k <= D/2k>=1 )。 但是,通過通過x ,我們可以找到從任何節點到所有其他節點的路徑最多為2 * (D/2 - k) = D - 2k - 因此,圖的直徑不能是D ,而是D - 2k .

這實際上是一個棘手的問題,但我想我明白了。 有趣的是,您部分錯誤的解決方案讓我走上了正確的道路。

讓我們在這里復制幾個定義:

  • 圖中兩個頂點之間的距離是最短路徑中的邊數
  • 頂點v的偏心率是v與任何其他頂點之間的最大距離
  • 圖的直徑d是圖中任意頂點的最大偏心率。 也就是說, d是任何一對頂點之間的最大距離

真正的問題是實際找到直徑,這不是一件容易的事。 要找到直徑,您不能只選擇任何節點並運行 BFS - 在這種情況下,您只需找到與該節點距離(偏心率)最大的節點,但它不是直徑。 要實際找到直徑,您必須從每個節點運行 BFS(= 查找偏心率),並且您獲得的最高距離是直徑(有一些更好的算法,但正如我所說 - 這不是簡單的任務)。

然而! 您根本不必知道直徑。 如果您實際上從隨機節點運行 BFS 並找到距離(偏心率)最高的節點 - 這就是您的算法的解決方案。 x將是您的起始節點, y將是距離最大的節點。

為什么? 如果你想象這樣的超級簡單的圖形

圖01

您可以看到直徑在節點 1 和節點 4 之間。因此,無論您從哪個點運行 BFS,該點都必須位於中間(這意味着它將具有直徑的一半)或不在中間,並且那么距離最大的節點的距離必須比直徑的一半還要高。

更復雜的圖形也不會改變事實圖02

如果您選擇 6 或 7,它的直徑路徑不完全(因為最大距離在 1-2-3-4-5 之間),但這意味着您獲得更高的距離,這對您的任務來說很好。


結果:從隨機節點運行BFS,當它結束時,取與起始節點距離最大的節點(=找到偏心並記住最遠的節點),起始和“結束”節點是(x,y)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM