多叉樹/圖結構維護問題轉線性結構——dfs序
阿新 • • 發佈:2018-12-06
dfs——深度優先遍歷搜尋
儲存結構:鏈式向前星
下面是我看到的一篇很好的鏈式向前星講解文章:
深度理解鏈式向前星
轉載出處: https://blog.csdn.net/ACdreamers/article/details/16902023
鏈式向前星的邏輯結構如下
dfs的執行程式碼
//建立邊結構體 struct edge { int To; //第i條邊的終點(初始化時為-1) int Weight; //此邊的權值(初始化為0) int Next; //與此邊相同起點的邊在edge陣列中的位置(初始化為-1) }Edge[MAXSIZE]; //向前星下標(0--MAXSIZE) //存邊器(鏈式向前星)構建完成 int cnt_edg=0; //存邊器下標儲存 int Head[MAXSIZE]; //Head[i]存以i為起點的廣度連結串列頭指標 void add(int from, int to,int value) {//加邊(from:起點/to:終點/value:權值) Edge[cnt_edg].To = to; //cnt_edg為向前星下標計數器(第cnt_edg條邊,cnt_edg從0開始) Edge[cnt_edg].Weight = value; //記錄權值 Edge[cnt_edg].Next = Head[from]; //此操作本質是連結串列的前插法(Head[from]為以from為起點的邊連結串列(儲存from廣度)頭指標) Head[from] = cnt_edg++; //存邊器存邊數+1 } //圖建立完成 int beg[MAXSIZE], last[MAXSIZE]; //begin[i]和last[i]分別儲存以i為起點的連通子圖(樹結構為子樹)的dfs序的起始位置和終止位置(子樹/子圖長度為last[i]-beg[i]+1) //dfs序儲存下標(1--MAXSIZE)(對應樹狀陣列) int cnt_dfs=0; //dfs序長度儲存 void dfs(int fa, int son) {//圖遍歷:fa:父結點,son:子結點 (遍歷以son為起點的子圖) (樹結構是遍歷son對應的子樹) //獲得一個以son為起點的dfs序() //dfs(-1,1)獲取整個圖的dfs邏輯序(以1為起點),想要儲存dfs序可根據beg[]來for迴圈 beg[son] = ++cnt_dfs; for (int i = Head[son];~i;i = Next[i]) //for迴圈是son的廣度 ~i:i!=-1 (~非運算子,-1的補碼全為1) if (fa != To[i]) dfs(son, To[i]); //廣度的每個子樹對應一個深度 last[son] = cnt_dfs; //(單個深度遍歷完畢) } //深搜完成