美文网首页
1129. 颜色交替的最短路径

1129. 颜色交替的最短路径

作者: 程序员小2 | 来源:发表于2022-10-18 16:13 被阅读0次

题目:

在一个有向图中,节点分别标记为 0, 1, ..., n-1。图中每条边为红色或者蓝色,且存在自环或平行边。

red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边。类似地,blue_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的蓝色有向边。

返回长度为 n 的数组 answer,其中 answer[X] 是从节点 0 到节点 X 的红色边和蓝色边交替出现的最短路径的长度。如果不存在这样的路径,那么 answer[x] = -1。

示例 1:

输入:n = 3, red_edges = [[0,1],[1,2]], blue_edges = []
输出:[0,1,-1]
示例 2:

输入:n = 3, red_edges = [[0,1]], blue_edges = [[2,1]]
输出:[0,1,-1]
示例 3:

输入:n = 3, red_edges = [[1,0]], blue_edges = [[2,1]]
输出:[0,-1,-1]
示例 4:

输入:n = 3, red_edges = [[0,1]], blue_edges = [[1,2]]
输出:[0,1,2]
示例 5:

输入:n = 3, red_edges = [[0,1],[0,2]], blue_edges = [[1,0]]
输出:[0,1,1]

提示:

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

思路:

计算最短路径,可以使用广度优先搜索实现。

由于题目中的图的表示方式是边数组,为了方便处理,需要首先将边数组转换成邻接结点列表的形式,转换后可以在 O(1)O(1) 时间获得一个结点的全部相邻结点,然后使用广度优先搜索遍历图。

由于这道题要求不同颜色边的颜色交替,因此需要分别得到红边和蓝边的邻接结点列表,广度优先搜索的状态包括结点和上次访问的边的颜色,需要记录每个结点分别以两种颜色的边作为结尾的路径长度。

初始时,结点 00 对应的红边路径和蓝边路径的长度都是 00。对于每个状态,其后续状态的结点为从当前结点出发经过一条颜色不同的路径到达的结点,其后续状态的颜色为与当前状态不同的颜色。

遍历结束后,每个结点的最短路径长度为该结点的红边路径长度和蓝边路径长度中的最小值。如果一个结点使用两种颜色的路径都不能到达,则该结点的最短路径长度为 -1−1。

java代码:

class Solution {

    public int[] shortestAlternatingPaths(int n, int[][] redEdges, int[][] blueEdges) {
        List<Set<Integer>> reds = new ArrayList<>();
        List<Set<Integer>> blues = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            reds.add(new HashSet<>());
            blues.add(new HashSet<>());
        }
        for (int i = 0; i < redEdges.length; i++) {
            int[] r = redEdges[i];
            reds.get(r[0]).add(r[1]);
        }
        for (int i = 0; i < blueEdges.length; i++) {
            int[] r = blueEdges[i];
            blues.get(r[0]).add(r[1]);
        }
        int ans[] = new int[n];
        boolean redhere[] = new boolean[n];
        boolean bluehere[] = new boolean[n];
        Arrays.fill(ans, -1);
        ans[0] = 0;
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[] { -1, 0, 0 });// 0red,1blue,step
        while (!queue.isEmpty()) {
            int[] cur = queue.poll();
            int from = cur[0], index = cur[1], step = cur[2] + 1;
            if (from == 0 || from == -1) {// 曾经以红色抵达index
                Set<Integer> set = blues.get(index);
                for (int b : set) {
                    if (!bluehere[b]) {
                        bluehere[b] = true;
                        if (ans[b] == -1) {
                            ans[b] = step;
                        }
                        queue.add(new int[] { 1, b, step });
                    }
                }
            }
            if (from == 1 || from == -1) {// 曾经以蓝色抵达index
                Set<Integer> set = reds.get(index);
                for (int b : set) {
                    if (!redhere[b]) {
                        redhere[b] = true;
                        if (ans[b] == -1) {
                            ans[b] = step;
                        }
                        queue.add(new int[] { 0, b, step });
                    }
                }
            }
        }
        return ans;
    }


}

相关文章

  • 1129. 颜色交替的最短路径

    题目: 在一个有向图中,节点分别标记为 0, 1, ..., n-1。图中每条边为红色或者蓝色,且存在自环或平行边...

  • Leetcode 1129. 颜色交替的最短路径(无权图的最短路

    问题描述 在一个有向图中,节点分别标记为 0, 1, ..., n-1。这个图中的每条边不是红色就是蓝色,且存在自...

  • LeetCode #1129 Shortest Path wit

    1129 Shortest Path with Alternating Colors 颜色交替的最短路径 Desc...

  • 图的应用-最短路径求解

    图的最短路径   图的最短路径是一个起点到一个终点之间最短的路径。  用于解决最短路径问题的算法被称做“最短路径算...

  • Yen的K条最短路径算法(KSP)

    一、问题介绍 1.求K条最短路径的必要性 最短路径问题分为: 单源最短路径 所有顶点对间的最短路径 共同的缺陷:这...

  • 最短路径算法

    最短路径算法可以分为两类:单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径。多源最短路径问题:求任...

  • 数据结构第二季 Day11 图 Kruskal算法、Dijkst

    一、最短路径基础知识 1、最短路径的定义是什么? 最短路径(Shortest Path):两顶点之间权值之和最小的...

  • 最短路径 之 Dijkstra 算法

    • 最短路径 之 Floyd 算法• 最短路径 之 Bellman 算法 Dijkstra算法是用于求解单源最短路...

  • 图 求解最短路径 时间复杂度 空间复杂度 单源最短路径 多源最短路径 条数最短(点权为1) 边权之和最小或最大(花...

  • 最短路径问题

    无权图单源最短路径 有权图单源最短路径 有权图单源最短路径和无权图最短路径不一样,不能单从节点数来看,比如上图中,...

网友评论

      本文标题:1129. 颜色交替的最短路径

      本文链接:https://www.haomeiwen.com/subject/uufszrtx.html