對於一顆有邊權的樹,,它的直徑表示樹中最遠的兩個節點之間的距離,,,
可以通過兩次深搜(廣搜)來求出直徑
從任意起點s開始,,求出到s的最遠的節點node,,然後再從node開始求出到node最遠的節點,,,搜尋的過程中更新節點的值和距離,,
(貌似還可以用樹形dp來求,,,
剛剛做的一道題,,當時感覺是兩倍的權值和減去乙個最遠的路,,,但是當時不會求最遠的路的距離,,就放棄了,,,後來有人說就是這個思想,,,就看了一下樹的直徑怎麼求,,,當然這題是求出到節點1最遠的路,,不是直徑,,,
紅書上的板子有點長,,而且建圖方式不怎麼用,,就不管了,,
// #include #include #include #include #include //#include #include #define aaa cout<<233dfs(v);}}
}void bfs(int s, int n)
}}
}}void solve(int n)
int main()
solve(n);
return 0;
}
裸題,,求樹的最長路,,也就是直徑,,
// #include #include #include #include #include //#include #include #define aaa cout<<233dfs(v);}}
}void solve()
int main()
solve();
return 0;
}
(end) 樹的直徑(最長路) 的詳細證明
主要是利用了反證法 假設 s t這條路徑為樹的直徑,或者稱為樹上的最長路 現有結論,從任意一點u出發搜到的最遠的點一定是s t中的一點,然後在從這個最遠點開始搜,就可以搜到另乙個最長路的端點,即用兩遍廣搜就可以找出樹的最長路 證明 1 設u為s t路徑上的一點,結論顯然成立,否則設搜到的最遠點為t則...
求樹的直徑
歡迎來踩本人部落格 樹的直徑 就是樹上最長路 方法 求兩邊dfs即可 步驟 1.從任意一點進行dfs,然後找到乙個最長路徑,記錄最遠點u 2.然後從u再進行dfs,找最長路徑,記錄一點v。u,v 就是樹的直徑 第四屆藍橋杯a組 證明 我們可以看出圖中,樹的直徑是 4 2 5 長度為9.我們一開始選定...
求樹的直徑
歡迎來踩本人部落格 樹的直徑 就是樹上最長路 方法 求兩邊dfs即可 步驟 1.從任意一點進行dfs,然後找到乙個最長路徑,記錄最遠點u 2.然後從u再進行dfs,找最長路徑,記錄一點v。u,v 就是樹的直徑 第四屆藍橋杯a組 證明 我們可以看出圖中,樹的直徑是 4 2 5 長度為9.我們一開始選定...