洛谷 P1099 樹網的核 題解

2021-08-21 15:37:22 字數 765 閱讀 6999

樓上的大佬似乎都用的dfs,像我這種蒟蒻只會用暴力的floyd演算法。不過,看到這道題規模只有300,floyd演算法不會有問題。

首先用floyd演算法預處理點對之間的距離,接下來窮舉每一對點構成的路徑(假裝每一條路徑就是樹網的核),如果路徑長<=s,則計算其它點到該路徑的最大距離,取窮舉到的所有路徑中最小的那個,即為答案。此時,對應的路徑是最優解,也必然是樹網的核。

其中,計算點到路徑的距離,由於這是一張樹網,且已經預處理點對之間的距離,從而點k到路徑(i,j)的距離即為

(dist[k][i]+dist[k][j]-dist[i][j])/2
(事實上相當於把重複計算的一部分減掉後,由於剩下的部分相當於算了兩次,就除以2。畫個圖很好理解的。)

注意樹網的核可能退化為乙個點,因此在窮舉點對(i,j)時不要忽略i==j的情況。

下面貼上**。

#include 

#define f(i) for(int i=1; i<=n; ++i) //運用巨集簡化**

const

int n=305,inf=0x3f3f3f3f;

int n,s,l,y,x,ans=inf,g[n][n];

inline

void read(int &x)

inline

int _min(int x,int y)

int main()

printf("%d\n",ans);

}

洛谷P1099 樹網的核

題目 對於這種題目描述比較長的題,可以考慮簡化題意。簡化後的題意 給定一棵帶邊權無根樹 在其直徑上求出一段長度不超過s的路徑f,使得離路徑距離最遠的點到路徑的距離最短。求最短距離。根據題目範圍,直接暴力floyd求多源最短路徑。然後 n 2 求出直徑和直徑端點。搜尋求出直徑上的點。然後再暴力找出所有...

洛谷 P1099 樹網的核

設t v,e,w t v,e,w 是乙個無圈且連通的無向圖 也稱為無根樹 每條邊到有正整數的權,我們稱tt為樹網 treebetwork 其中vv,ee分別表示結點與邊的集合,ww表示各邊長度的集合,並設tt有nn個結點。路徑 樹網中任何兩結點aa,bb都存在唯一的一條簡單路徑,用d a,b d a...

P1099 樹網的核

這裡是o n 2 的做法 首先可以證明,對於每一條直徑,求出的偏心距是一樣的 怎麼證明?顯然 我不會 怎樣求樹的直徑?簡單。貪心 在一條直徑上,顯然選擇的路徑越長越好 實現 首先求出樹上所有點之間的距離 n 2 一直dfs就行 然後找出直徑及直徑經過的點 最後在直徑上貪心的取即可 include i...