1. 樹上面求最長路簡單路(無環). 就是樹的直徑問題.
2. 樹的直徑問題經典: 兩遍bfs即可.
問題分析:
(1). 一開始任取乙個點u進行搜尋查詢出距離點u最遠距離的點v和長度.
(2). 第二次bfs則從第一次中的點v找出距離點v最遠距離的點的路徑長度.
3. 問題正確性.
證明:
(1). 情況1: u在最長路上, 那麼v一定是最長路的一端.
反證法: v不是在最長路的一端, 即有乙個v1使得(u->v1)是最長路的一部分,
就有: dist(u->v1) > dist(u->v); 矛盾.
即: v在最長路的一端. (第二次bfs就可以找出距離v最遠的點的長度.)
(2). 情況2: u不再最長路上, 則有點u到點v的路與最長路一定有乙個交點c.
並且(c->v)與最長路的後半段是重合的. 即v一定是最長路的一端.
1int dis = -1
, node;
2void dfs(int x, int
num)
6for(int i = 0; i < v[x].size(); i++)9}
10 dfs(1, 1
);11 dis = -1
;12 dfs(node, 1
);13 dis == 直徑
裸的樹的直徑
1 #include 2 #include 3 #include 4 #include5using
namespace
std;
6const
int maxn = 1e4+10
;7 vectorv[maxn];
8 vectorvv[maxn];
9bool
vis[maxn];
10int
n, sum, u;
11struct
node;
14void d(int
x)34
q.push(a);35}
36}37}
38}39using
namespace
std;
40int
main()
48 d(1
);49
d(u);
50 printf("
%d\n
", (21+sum)*sum/2
);51
return0;
52 }
只有不斷學習才能進步!
樹的直徑與重心
樹的直徑,指樹上最長的不重複經過同乙個點的路徑。方法 先從任意一點p pp出發,找離它最遠的點q qq,再從點q qq出發,找離它最遠的點w ww,w ww到q qq的距離就是的直徑 具體實現可以使用兩次dfs dfsdf s。演算法證明 反證法 include using namespace st...
樹的直徑與樹的中心
1.樹的直徑 概念 樹中的最長路。求法 兩次深搜或dp。1 兩次深搜 任找一點a為源點,深搜遍歷得到最遠點b,這個最遠點b必定在直徑中 感性想想,以a點為源點找到的最長路後面一段必定屬於樹的直徑的一部分 再以這個最遠點b為源點深搜遍歷求乙個最長路,這個最長路即為樹的直徑。2 dp 顯然最長路的兩個端...
SDOI2013 直徑(樹的直徑)
小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...