樹的直徑為樹上最長的一條路徑(不經過重複節點),也可以看做是樹上最長路。
通常的求法:
1.兩邊bfs或兩邊dfs
2.樹形dp(端點為根和僅經過根)。
emmm 。。蒟蒻表示目前只會第一種qaq。
從樹中找出任意一點,求出與他距離最遠的點s,再用同樣的方法求出與s距離最遠的點t,s-t即為樹的直徑。
bfs**
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;78
intn,l,r,cnt,pos,ans;
9int first[100010],next[200010
];10
int q[100010],de[100010
];11
bool used[100010
];12
13struct
maplerode[200010
];16
17void build(int f,int
t)18
;20 next[cnt]=first[f];
21 first[f]=cnt;22}
23void bfs(int
k)2441}
42 pos=q[head] ; ans=de[pos];43}
4445
intmain()
4654 bfs(1
);55
bfs(pos);
56 printf("%d"
,ans);
57return0;
58 }
dfs **
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;78
intn,l,r,cnt,pos,ans;
9int first[100010],next[200010
];10
11struct
maplerode[200010
];14
15void build(int f,int
t)16
;18 next[cnt]=first[f];
19 first[f]=cnt;20}
21void dfs(int k,int dis,int
fa)22
2829
intmain()
3038 dfs(1,0,-1
);39 dfs(pos,0,-1
);40 printf("%d"
,ans);
41return0;
42 }
例題:codevs 1814 最長鏈
poj2831 樹的直徑 bfs dfs
這裡給出樹的直徑的證明 主要是利用了反證法 假設 s t這條路徑為樹的直徑,或者稱為樹上的最長路 現有結論,從任意一點u出發搜到的最遠的點一定是s t中的一點,然後再從這個最遠點開始搜,就可以搜到另乙個最長路的端點,即用兩遍廣搜就可以找出樹的最長路 證明 1.設u為s t路徑上的一點,結論顯然成立,...
樹的直徑 學習筆記1(入門)
poj 2631 roads in the north 題目大意 給你一棵樹,求這棵樹的直徑。樹的直徑 樹中最長的簡單路徑。簡單路徑 路徑上各點均不重複。以下證明內容 這裡給出樹的直徑的證明 主要是利用了反證法 假設 s t這條路徑為樹的直徑,或者稱為樹上的最長路 現有結論,從任意一點u出發搜到的最...
樹的直徑與重心學習筆記
此文為完成任務所設,可能不易懂,能看懂就將就著看吧 樹的定義 不存在環且聯通的圖。樹的直徑 樹中的最長鏈 樹的重心 為乙個點,以此點為根,最大子樹的大小最小。樹的直徑求法分兩種 兩次 dfs bfs 與樹形 dp 首先講好理解點的樹形 dp 其實很簡單,每個節點維護子樹到這個點的最長鏈和次長鏈。對於...