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; //(单个深度遍历完毕)
}
//深搜完成