傳送門
//題意: 給你很多顆樹(當然也可能只有一棵樹), 問你怎樣連線起來可以使得形成的樹上最遠的距離最小,並輸出這個距離.
//思路: 當然是和樹的直徑有關, 然後可以知道從直徑折半的地方連出去是最優的, 先用並查集求出每一棵樹的直徑. 然後需要討論幾種情況, 一是有一棵樹它的直徑本來就很長, 那麼答案有可能是它, 然後(必須兩棵樹以上)就是直徑第一長的和第二長的, 可能是一種答案, 還有一種就是(必須三棵樹以上)以直徑最長的樹作為中轉點, 第二長的和第三長的通過這個相連, 那麼答案也可能是這種情況最優, 如果你要問為什麼不以第三長的作為中轉點的話, 那就是沒懂起題意, 要讓最遠的距離最小, 所以只能這樣, 細節請看**.
ac code
const
int maxn = 1e5+5;
int cas=1;
int pre[maxn],vis[maxn];
int n,m;
vector
g[maxn];
int find(int x)
int maxx;
int dfs(int u,int fa)
if(fir + sec > maxx) maxx = fir + sec;
return fir + 1;
}int d[maxn];
bool cmp(int a,int b)
void solve()
int idx = 0 ;
for(int i=1;i<=n;i++)
sort(d,d+idx,cmp);
int res = d[0]; //第一種情況
if(idx > 1)
if(idx > 2)
printf("%d\n",res);
}}
Gym 101522B樹的直徑
題意 給出一棵樹,然後按照所給出的方式建立新的邊,然後可以一層層的建邊直到無邊可建。問需要多少個小時,每乙個小時可以建立一條邊,可以多執行緒建立。思路 畫圖可以找到規律,最壞的情況是n個點是乙個線性的,那麼時間將是最長,根據線性找規律發現其長度與時間是以2倍遞增的,每乙個新的小時便可以在原來的基礎上...
SDOI2013 直徑(樹的直徑)
小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...
樹的直徑 板子
不帶解釋版模板o n 常數較大,但是可以知道樹上每一點到直徑端點的距離,這個大多時候都很有用 struct node e maxn 2 ll dis1 maxn dis2 maxn int st,ed,max len void dd int u,int fa,int len,int flag fil...