桃花
題解討論
檢視他人的提交
我的提交
時間限制: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,並且,第一條請求無資料返回,第二條請求才會返...