返回信息流无向图中,给定起点和终点,求起点和终点之间的定长为n的路径。
①从起点开始使用深度优先搜索(标记起点的深度为0),DFS操作直到遇到终点输出或者直到深度等于n。②过程使用递归实现,入栈起点之后判断其任一相邻节点,入栈该相邻节点,继续反复进行入栈操作,直到达到①中的条件而出栈回退。
该方法的复杂度非常非常大… 如果n=20,在完全有向图中,入栈出栈的次数会达到20!。怒被怼
各路大佬求解
这是一条镜像帖。来源:北邮人论坛 / cpp / #97376同步于 2018/4/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【讨论】【问题】无向图中,给定起点和终点,求起点和终点之间
loongking
2018/4/9镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这个应该发在算法板块吧
不过如果是递归爆栈的问题,改成非递归估计也会超时,还是考虑考虑优化一下吧,或者这压根不用考虑超时?
还有记得标记入栈过的节点,不然可能死循环,这是常规dfs思路
然而这题似乎还要考虑有些情况必须走环路才能得到解,这就很复杂了
哇 感谢大佬的回复
因为起点和终点之间的边的数目有限制 所以我在做递归的时候如果深度达到了“边的数目”还没有到达终点就会return,递归的深度会被限制,这样以来递归应该入栈的不会过多,但是目前时间确实很长很长很长
关于标记入过栈的节点,标记之后的点不能再入栈吗。但是会存在从不同节点都递归到同一个子节点的情况。我不太清楚这样是不是还需要标记入过栈
【 在 Nroskill 的大作中提到: 】
: 这个应该发在算法板块吧
: 不过如果是递归爆栈的问题,改成非递归估计也会超时,还是考虑考虑优化一下吧,或者这压根不用考虑超时?
: 还有记得标记入栈过的节点,不然可能死循环,这是常规dfs思路
: ...................
我的意思是这个题按照你的描述本身并不严谨啊,比如图
```
B
/ \
A C - D
\ /
E
```
起点A终点D这种存在环的
甚至是下面这样的图
```
A - B
```
起点A终点B,让你找出长度为3的路径,那么就可以是A-B-A-B
题中是否有限制同一路径内不得交叉呢?如果可以交叉那就太复杂了,比如上面我说的情况,如果不可交叉的话找出所有路径枚举即可
【 在 loongking 的大作中提到: 】
: 哇 感谢大佬的回复
: 因为起点和终点之间的边的数目有限制 所以我在做递归的时候如果深度达到了“边的数目”还没有到达终点就会return,递归的深度会被限制,这样以来递归应该入栈的不会过多,但是目前时间确实很长很长很长
: 关于标记入过栈的节点,标记之后的点不能再入栈吗。但是会存在从不同节点都递归到同一个子节点的情况。我不太清楚这样是不是还需要标记入过栈
: ...................
嗯 是我题目表述的不太清楚
1.可能存在环,但是我把所有节点都只记录编号比自己大的相连的节点作为子节点,通过这个手段排除环的干扰,这样在找相连点的时候,不会往回找。不知是否可行?
2.枚举所有的可能定长路径是不是可能情形过多,60个点取长度为20的路径,约(60!-40!)种排列
【 在 Nroskill 的大作中提到: 】
: 我的意思是这个题按照你的描述本身并不严谨啊,比如图
: [md]
: ```
: ...................
感觉就能找出 1- 2- 3 -4?我想错了吗
【 在 Nroskill 的大作中提到: 】
: 我觉得不行。
: 下面这种情况,1是起点,4是终点,让你找长度为4的,岂不是凉凉
: [md]
: ...................
1234长度是3吧……
我的意思是你找不到16534
【 在 loongking 的大作中提到: 】
: 感觉就能找出 1- 2- 3 -4?我想错了吗
:
无环动态规划啊,每个点到起点的路径数是固定的,这样每个点就只求一次。如果有环就没有什么特别通用的解法,很多时候是用targen之类的方法把环缩了之后再做