1. 程式人生 > >多叉樹/圖結構維護問題轉線性結構——dfs序

多叉樹/圖結構維護問題轉線性結構——dfs序

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;       //(單個深度遍歷完畢)
}
//深搜完成