python最短路径画虚线_Python中具有交替颜色的最短路径

假设我们有向图,其节点标记为0、1,...,n-1。在此图中,每个边缘都用红色或蓝色上色,并且可能有自边缘或平行边缘。red_edges中的每个[i,j]表示从节点i到节点j的红色有向边。类似地,blue_edges中的每个[i,j]表示从节点i到节点j的蓝色有向边。我们必须找到长度为n的数组答案,其中每个答案[X]是从节点0到节点X的最短路径的长度,以使边缘颜色沿路径交替(如果不这样,则为-1)存在)。

因此,如果输入像n = 3,red_edges = [[0,1],[1,2]]和blue_edges = [],那么输出将是[0,1,-1]

为了解决这个问题,我们将遵循以下步骤-定义一个名为bfs()的方法,它将使用re,be,f和n

定义一个称为Visited的集合,定义一个队列并插入一个三元组[0,f,0]

当q不为空时对于每一个我来说[当前]

如果未访问对(i,color),则将(i,color)插入Visited并将[i,color,step + 1]插入q

对于每个我[当前]如果未访问对(i,color),则将(i,color)插入Visited并将[i,color,step + 1]插入q

将三线态电流,颜色,步长设置为q [0],然后从q中删除

color:=补全color的值(真为假,反之亦然)

res [current]:= res [current]和step的最小值

如果颜色不为零,则

否则当color为0时

在主要方法中-

res:=一个无穷大值的数组,其大小为n

re and是:= n个空数组的数组

对于r中的每个元素i:将i [1]插入re [i [0]]

对于b中的每个元素i:将i [1]插入be [i [0]]

调用bfs(re,be,false,n)并调用bfs(re,be,true,n)

当我的范围是0到res的长度– 1如果res [i] = inf,则res [i]:= -1

返回资源

示例(Python)

让我们看下面的实现以更好地理解-class Solution(object):

def shortestAlternatingPaths(self, n, r, b):

self.res = [float("inf")] * n

re = [[] for i in range(n) ]

be = [[] for i in range(n) ]

for i in r:

re[i[0]].append(i[1])

for i in b:

be[i[0]].append(i[1])

self.bfs(re,be,False,n)

self.bfs(re,be,True,n)

for i in range(len(self.res)):

if self.res[i] == float('inf'):

self.res[i]=-1

return self.res

def bfs(self,re,be,f,n):

visited = set()

queue = [[0,f,0]]

while queue:

current,color,step = queue[0]

queue.pop(0)

color = not color

self.res[current] = min(self.res[current],step)

if color:

for i in re[current]:

if (i,color) not in visited:

visited.add((i,color))

queue.append([i,color,step+1])

elif not color:

for i in be[current]:

if (i,color) not in visited:

visited.add((i,color))

queue.append([i,color,step+1])

ob = Solution()

print(ob.shortestAlternatingPaths(3, [[0,1], [1,2]], []))

输入值3

[[0,1],[1,2]]

[]

输出结果[0,1,-1]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值