今天乙個師哥講了圖的高階,感覺師哥講的很好,有很多啟發性的問題。
其中乙個問題是圖的搜尋和圖的遍歷有什麼區別?
最大的區別就是遍歷只需要掃瞄一遍圖。
而每一次搜尋可能都需要搜尋全圖的時間複雜度。
所以如果拿沒有優化的搜尋去暴力的話,每一次搜尋都需要遍歷一遍圖。這樣有很大的可能性是會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必然找到另外一...