[英]Graph Theory Algorithm
給定的問題是
給定一個具有n個頂點的森林,請添加邊以使其成為直徑最小的樹。 我嘗試了許多方法,但沒有一個通過系統測試用例。請提出一些算法來解決此問題。
這是社論ncpc.idi.ntnu.no/ncpc2015/ncpc2015slides.pdf的鏈接。問題名稱為Adjoin the Networks。 我無法理解社論中提供的解決方案
更新:
https://www.quora.com/What-is-the-solution-for-Dreaming-on-IOI-2013
該鏈接為社論中提到的解決方案提供了最佳解釋
頂點v
的偏心率表示為ecc(v)
,定義為ecc(v):=max_u d(u,v)
,即到圖中最遠頂點的距離。 曲線圖G
中心是ecc(v)=min_v max_u d(u,v)
任何頂點v
,即中心是使偏心率最小的頂點。
如果合並兩棵樹(來自不同的連接組件) T1
和T2
,通過在它們的中心c1
和c2
之間放置一條邊,您將得到一棵樹T
,其diam T = max(diam T1, diam T2, 1+rad(T1)+rad(T2))
。
從這些屬性可以明顯看出以下方法的正確性。
這是該算法的一個主意,讓我無所適從:
T1
, T2
,..., Tk
為組成森林的樹木。 Ti
的中心頂點 ci
。 當然,現在的問題是如何巧妙地解決最后一個問題。 直觀地,我建議您先將直徑最大的treest連接起來(然后更新新樹的直徑並計算新樹的中心)。 也許是這樣的:
而優先級隊列包含一個以上的樹做
T1
和T2
為最大直徑的樹木; 令c1
和c2
為中心; c1
和c2
形成新樹T
; T
的新中心c
,計算diam T
並將T
放回優先級隊列(可以是使用直徑作為鍵的最大堆)。 完成
更新。 我不確定是先加入大直徑樹還是反過來(即先加入最小直徑樹)。 但是現在很容易做一個草圖證明(一旦您弄清楚要走的路),證明這是正確的路。
更新。 如果您首先連接最大的模塊,則數學當然會通過(如PDF中所建議)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.