5132. Shortest Path with Alternating Colors

本文介绍了一种使用广度优先搜索(BFS)算法求解从节点0到其他各节点的最短路径问题的方法,其中路径上的边颜色需交替出现。通过构建红色与蓝色边的邻接表,并利用双队列实现不同颜色边的交替遍历,最终得到所有可达节点的最短交替路径长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Consider a directed graph, with nodes labelled 0, 1, ..., n-1.  In this graph, each edge is either red or blue, and there could be self-edges or parallel edges.

Each [i, j] in red_edges denotes a red directed edge from node i to node j.  Similarly, each [i, j] in blue_edges denotes a blue directed edge from node i to node j.

Return an array answer of length n, where each answer[X] is the length of the shortest path from node 0 to node X such that the edge colors alternate along the path (or -1 if such a path doesn't exist).

 

Example 1:

Input: n = 3, red_edges = [[0,1],[1,2]], blue_edges = []
Output: [0,1,-1]

Example 2:

Input: n = 3, red_edges = [[0,1]], blue_edges = [[2,1]]
Output: [0,1,-1]

Example 3:

Input: n = 3, red_edges = [[1,0]], blue_edges = [[2,1]]
Output: [0,-1,-1]

Example 4:

Input: n = 3, red_edges = [[0,1]], blue_edges = [[1,2]]
Output: [0,1,2]

Example 5:

Input: n = 3, red_edges = [[0,1],[0,2]], blue_edges = [[1,0]]
Output: [0,1,1]

 

Constraints:

  • 1 <= n <= 100
  • red_edges.length <= 400
  • blue_edges.length <= 400
  • red_edges[i].length == blue_edges[i].length == 2
  • 0 <= red_edges[i][j], blue_edges[i][j] < n

思路:BFS

class Solution(object):
    def shortestAlternatingPaths(self, n, red_edges, blue_edges):
        """
        :type n: int
        :type red_edges: List[List[int]]
        :type blue_edges: List[List[int]]
        :rtype: List[int]
        """
        adj_red={}
        for s,t in red_edges: 
            if s not in adj_red: adj_red[s]=set()
            adj_red[s].add(t)
        adj_blue={}
        for s,t in blue_edges: 
            if s not in adj_blue: adj_blue[s]=set()
            adj_blue[s].add(t)
        
        res={0:0}
        q=[(0,0),(0,1)]
        vis=set(q)
        qq=[]
        step=1
        while q:
            while q:
                s,f=q.pop()
                target=adj_red if f==0 else adj_blue
                for t in target.get(s,[]):
                    if (t,1-f) in vis: continue
                    qq.append((t,1-f))
                    vis.add((t,1-f))
                    if t not in res: res[t]=step
            q,qq=qq,q
            step+=1
        
        return [res[i] if i in res else -1 for i in range(n)]
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值