HDU 2196 dfs 樹的直徑

2021-08-24 18:02:36 字數 1197 閱讀 6446

今天乙個師哥講了圖的高階,感覺師哥講的很好,有很多啟發性的問題。

其中乙個問題是圖的搜尋和圖的遍歷有什麼區別?

最大的區別就是遍歷只需要掃瞄一遍圖。

而每一次搜尋可能都需要搜尋全圖的時間複雜度。

所以如果拿沒有優化的搜尋去暴力的話,每一次搜尋都需要遍歷一遍圖。這樣有很大的可能性是會t的。

接下來講講 hdu - 2196 這道題,這道題如果直接暴力搜尋,以每個點作為根節點的話,很有可能會t,所以需要用到樹的直徑的性質。

樹的直徑的定義:樹中所有最短路徑的最大值。

所以樹上任意一點對應的距離最遠端點一定是 樹的直徑的某個端點。

所以這題只需要三遍dfs就可以做出來了。

第一遍找出樹的乙個直徑端點a。

第二遍計算其餘所有點到a的距離,並找出樹的直徑的另乙個端點b。

第三遍計算其餘所有點到端點b的距離。

樹上任意一點對應的距離的最大值一定是到某乙個端點的距離。

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

#define maxn 10005

struct edge

edge[maxn*2];

int head[maxn*2];

int n;

int rt;

int drt[maxn];

int d1[maxn];

int d2[maxn];

int total;

void add(int u,int v,int l)

void dfs(int u,int fa,int d) //從u點遍歷到根節點 並將結果儲存在陣列中

memset(drt,0,sizeof(drt));

memset(d1,0,sizeof(d1));

memset(d2,0,sizeof(d2));

rt=1;

dfs(1,-1,drt);

dfs(rt,-1,d1);

dfs(rt,-1,d2);

for(int i=1;i<=n;i++)

一點注意:

用鄰接表儲存的圖,bfs和dfs的時間複雜度均為 o(v+e) 。

hdoj2196(樹形dp,樹的直徑)

題意 給出一棵樹,求每個結點可以到達的最遠距離。思路 如果求得是樹上最長距離,兩次bfs就行。但這裡求的是所有點的最遠距離,樹形dp的經典題,想了乙個小時,還是dp做得太少。分析可得對任意結點u,它的最長距離要麼是向下延伸的最長距離,要不向上延伸的最長距離。我們用dp u 0 表示節點u向下 子結點...

hdu4607雙dfs求樹的直徑 公式

如下 include include include include using namespace std 這是我寫的求樹的直徑的最後一種方法,寫完我就去玩 樹形dp了。祝福我吧。省賽也即將來臨,東北賽也如期而至,希望自己可以打得更好。以最短的時間複習功課,爭取不掛科就行。以效率來搶時間。加油df...

樹的直徑 兩次dfs求樹的直徑

樹的直徑是一棵樹的某兩個最深的葉子節點的連線,多用於與圖論演算法巢狀考 1 很簡單的演算法,不會單獨考,學習和熟練使用它的多種情況 很簡單,兩次dfs 至於為什麼,可以畫圖模擬一下,因為一次dfs必然會在一棵子樹或者根節點上,每次dfs必然找到一棵子樹的最深的葉子節點,那麼第二次dfs必然找到另外一...