樹的最長路徑即樹上的最遠點對,也被稱為樹的直徑。
這可以用兩遍dfs來求。第一遍dfs先任選乙個點,找出離這個點最遠的點maxd。該點必為最長路徑上的乙個端點(可以用反證法證明)再從maxd這個點出發再進行一次dfs就能找到另乙個端點。
#include#include#include#includeusing namespace std;
int n,cnt,max0,maxd,x,y,maxx[210035],t[210035],head[210035],nxt[210035],to[210035],dep[100035];
void add(int x,int y)
void dfs(int u,int fa)
if (dep[u]>max0) max0=dep[u],maxd=u;
}int main()
max0=0;
dfs(1,0);
memset(dep,0,sizeof(dep));
max0=0;
dfs(maxd,0);
printf("%d\n",max0);
}
求樹的直徑 樹中最長路
對於一顆有邊權的樹,它的直徑表示樹中最遠的兩個節點之間的距離,可以通過兩次深搜 廣搜 來求出直徑 從任意起點s開始,求出到s的最遠的節點node,然後再從node開始求出到node最遠的節點,搜尋的過程中更新節點的值和距離,貌似還可以用樹形dp來求,剛剛做的一道題,當時感覺是兩倍的權值和減去乙個最遠...
BJ模擬 路徑規劃 樹的直徑
題目描述 給定一棵有權無根樹,求一條路徑滿足路徑上邊權的最小值與路徑邊權之和的乘積盡量大,輸出最大乘積。1 n 300000 1 n 300000 解題思路 思路肯定是將邊從大到小加入,這樣就是用找到經過這條邊的最長鏈了。那如何找經過這條邊的最長鏈呢?設這條邊連線的兩個聯通塊為s,t s,t 其塊內...
樹的直徑(最長路) 的詳細證明
主要是利用了反證法 假設 s t這條路徑為樹的直徑,或者稱為樹上的最長路 現有結論,從任意一點u出發搜到的最遠的點一定是s t中的一點,然後在從這個最遠點開始搜,就可以搜到另乙個最長路的端點,即用兩遍廣搜就可以找出樹的最長路 證明 1 設u為s t路徑上的一點,結論顯然成立,否則設搜到的最遠點為t則...