多叉树/图结构维护问题转线性结构——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;       //(单个深度遍历完毕)
}
//深搜完成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值