java最多有多少条路径_java – 具有最大顶点数的最短路径

我想找到两个顶点之间的最短路径和一个额外的约束:可以访问max n个顶点.该图是定向的,连接的,非负权重,并且可以包含循环.

例:

4053f755b5372e8934de62299982dd4b.png

> n = 2的最短路径0-> 2是18

> n = 3的最短路径0-> 3是22

> n = 4的最短路径0-> 3是9

到目前为止,我已经实现了Djikstras算法以获得简单的最短路径,我的想法是保持当前访问的顶点的计数器,如果它超过n它需要一个或多个步骤并尝试使用另一个路径..但​​到目前为止据我所知,Djikstras不能用于here所述的回溯.

另一个想法是以某种方式存储表中每个节点之间的每条路径.但我不确定Djikstra如何发现重量为18的路径0-> 2,因为它不是真正的最短路径……

有没有人有任何想法如何解决这个问题?

解决方法:

将每个顶点划分为n个顶点,即对于顶点u,我们创建n个顶点,表示为(u,1)…(u,n),第二个数字表示到此顶点的步数.对于从u到v的每个边,我们创建从(u,i)到(v,i 1)的边,其中在新图中1< = i< = n-1.现在,如果你想用u计算u和v之间的最短路径,只需从(u,1)做Dijkstra,那么你的答案就是min(结果(v,i)| 1< = i< = n)

顶点总数可以是n * n,因此复杂度约为O(n ^ 2 * log(n ^ 2))

标签:java,algorithm,graph,graph-theory,graph-algorithm

来源: https://codeday.me/bug/20190829/1762435.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值