Gym 100781A 樹的直徑 思維

2021-08-09 02:26:40 字數 902 閱讀 5147

傳送門

//題意: 給你很多顆樹(當然也可能只有一棵樹), 問你怎樣連線起來可以使得形成的樹上最遠的距離最小,並輸出這個距離.

//思路: 當然是和樹的直徑有關, 然後可以知道從直徑折半的地方連出去是最優的, 先用並查集求出每一棵樹的直徑. 然後需要討論幾種情況, 一是有一棵樹它的直徑本來就很長, 那麼答案有可能是它, 然後(必須兩棵樹以上)就是直徑第一長的和第二長的, 可能是一種答案, 還有一種就是(必須三棵樹以上)以直徑最長的樹作為中轉點, 第二長的和第三長的通過這個相連, 那麼答案也可能是這種情況最優, 如果你要問為什麼不以第三長的作為中轉點的話, 那就是沒懂起題意, 要讓最遠的距離最小, 所以只能這樣, 細節請看**.

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...