假设我们有向图,其节点标记为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
返回资源
让我们看下面的实现以更好地理解-
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]