樹的最長直徑一次遍歷和兩次遍曆法

2021-10-25 17:19:15 字數 2013 閱讀 2957

桃花

題解討論

檢視他人的提交

我的提交

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

題目描述

桃花一簇開無主,可愛深紅映淺紅。

——《題百葉桃花》

桃花長在桃樹上,樹的每個節點有乙個桃花,調皮的htbest想摘盡可能多的桃花。htbest有乙個魔法棒,摘到樹上任意一條鏈上的所有桃花,由於htbest法力有限,只能使用一次魔法棒,請求出htbest最多可以摘到多少個桃花。

輸入描述:

第一行有乙個正整數n,表示桃樹的節點個數。

接下來n-1行,第i行兩個正整數ai,bi ,表示桃樹上的節點ai,bi之間有一條邊。

輸出描述:

第一行乙個整數,表示htbest使用一次魔法棒最多可以摘到多少桃花。

示例1輸入複製3

1 22 3

輸出複製

3示例2

輸入複製

31 2

1 3輸出複製3

示例3輸入複製4

1 22 3

3 4輸出複製4

備註:對於100%的測試資料:

1 ≤ n ≤ 1000000

資料量較大,注意使用更快的輸入輸出方式。

兩次遍歷是指從任意一點出發到最遠的乙個點,在從這乙個點出發,遍歷到的最遠的路徑即是答案。

一次遍歷是指我們需要的即是一棵樹的最長和第二長的子樹之和,我們每一次維護兩個值即可,然後邊遍歷,邊返回值。

兩次遍曆法:

#include

#include

using

namespace std;

const

int maxn=

1e8;

vector<

int>mp[maxn]

;//鄰接表存圖

int n;

int ans=0;

int now=1;

int vis[maxn]

;void

dfs(

int u,

int dist)

vis[u]=1

;for

(int i=

0;i.size()

;i++)}

intmain()

dfs(1,

0);//第一次遍歷

memset

(vis,0,

sizeof vis)

;dfs

(now,0)

;//第二次遍歷

cout<1

}

一次遍曆法

#include

#include

#include

using

namespace std;

const

int n =

20010

, m =

20010

;int n, m;

int h[n]

, e[m]

, ne[m]

, idx;

int ans;

//鏈式前向星存圖,但是記憶體超限過不了

void

add(

int a,

int b)

intdfs

(int u)

ans =

max(ans, d1 + d2)

;//實時更新答案

return d1 +1;

//+1是指當前點到上乙個點的邊

}int

main()

for(

int i =

1; i <= m; i ++

)dfs(1

);cout << ans+

1<< endl;

return0;

}

樹的直徑 兩次dfs求樹的直徑

樹的直徑是一棵樹的某兩個最深的葉子節點的連線,多用於與圖論演算法巢狀考 1 很簡單的演算法,不會單獨考,學習和熟練使用它的多種情況 很簡單,兩次dfs 至於為什麼,可以畫圖模擬一下,因為一次dfs必然會在一棵子樹或者根節點上,每次dfs必然找到一棵子樹的最深的葉子節點,那麼第二次dfs必然找到另外一...

一次跳轉和兩次跳轉

我們在做 jsp或者 servlet 跳轉時,經常用到一次跳轉和兩次跳轉,到底這兩者有什麼區別呢?下面是伺服器端的兩個 jsp頁面 test1.jsp request.setattribute username leno test2.jsp requestdispatcher rd request....

一次提交觸發兩次請求

我們公司的專案都是前後端分離的,上線幾個月以來,發現乙個很奇怪的問題,每次前端發起請求,通過瀏覽器的開發者工具都能看到在network下同乙個url有兩條請求,第一條請求的method為options,第二條請求的method才是真正的get或者post,並且,第一條請求無資料返回,第二條請求才會返...