php多叉树图,多叉树/图结构维护问题转线性结构——dfs序

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、付费专栏及课程。

余额充值