• 1129. 颜色交替的最短路径(leetcode,广搜,可重做)-------------------Java实现


    1129. 颜色交替的最短路径(leetcode,广搜,可重做)-------------------Java实现

    题目表述

    给定一个整数 n,即有向图中的节点数,其中节点标记为 0 到 n - 1。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。

    给定两个数组 redEdges 和 blueEdges,其中:

    redEdges[i] = [ai, bi] 表示图中存在一条从节点 ai 到节点 bi 的红色有向边,
    blueEdges[j] = [uj, vj] 表示图中存在一条从节点 uj 到节点 vj 的蓝色有向边。
    返回长度为 n 的数组 answer,其中 answer[X] 是从节点 0 到节点 X 的红色边和蓝色边交替出现的最短路径的长度。如果不存在这样的路径,那么 answer[x] = -1。

    样例

    n =5
    redEdges =[[0,1],[1,2],[2,3],[3,4]]
    blueEdges =[[1,2],[2,3],[3,1]]

    条件

    1 <= n <= 100
    0 <= redEdges.length, blueEdges.length <= 400
    redEdges[i].length == blueEdges[j].length == 2
    0 <= ai, bi, uj, vj < n

    思路

    通过一个二维[n][2]List来记录当前点可以到达的下个点。
    广搜,搜索记录到达点的长度。

    注意点

    x^1 可实现 x1时返回0,x0时返回1,异或运算。

    ac代码

    Java:
    package leetcode1129;
    
    import java.util.*;
    
    class Solution {
        public int[] shortestAlternatingPaths(int n, int[][] redEdges, int[][] blueEdges) {
        List<Integer> target[][] = new List[n][2];
        int[][] visit = new int[n][2];
        int max = 10000009;
        for (int i=0;i<n;i++) {
            target[i][0] = new ArrayList<Integer>();
            target[i][1] = new ArrayList<Integer>();
            visit[i][0] = max;
            visit[i][1] = max;
        }
        for (int[] x:redEdges)
            target[x[0]][0].add(x[1]);
            for (int[] x:blueEdges)
                target[x[0]][1].add(x[1]);
            Queue<Integer[]> q = new LinkedList<>();
            q.offer(new Integer[]{0,0});
            q.offer(new Integer[]{0,1});
            int this_step = 0;
            while(!q.isEmpty())
            {
                int this_longth = q.size();
                while(this_longth--!=0)
                {
                    Integer[] now_sit = q.poll();
                    if (visit[now_sit[0]][now_sit[1]]!=max)
                        continue;
                    else
                        visit[now_sit[0]][now_sit[1]]=this_step;
                    for (Integer now:target[now_sit[0]][now_sit[1]^1])
                        q.offer(new Integer[]{now,now_sit[1]^1});
                }
                this_step++;
            }
            int[] result = new int[n];
            for (int i=1;i<n;i++) {
                result[i] = Math.min(visit[i][0], visit[i][1]);
                if (result[i]==max)
                    result[i] =-1;
            }
            return result;
        }
    }
    
    public class leetocde1129 {
        public static void main(String[] args) {
            int n = 5;
            int[][] red_edges = new int[][]{
                    {0,1},{1,2},{2,3},{3,4}
            };
            int[][] blue_edges = new int[][]{{1,2},{2,3},{3,1}};
            Solution s = new Solution();
            int[] result = s.shortestAlternatingPaths(n,red_edges,blue_edges);
        for (int x:result)
            System.out.println(x+" ");
        };
    
    
    
            }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
  • 相关阅读:
    「Java开发指南」在MyEclipse中的Spring开发(一)
    【Mapbox GL JS 入门】Hello world
    MFC Windows 程序设计[228]之拖拽列表(附源码)
    抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。
    ClickHouse进阶(十九):clickhouse管理与运维-权限管理
    如何将接口的返回值中所需信息提取出来作为其他接口的入参使用(postman与jmeter的使用)
    目标检测系列——Fast R-CNN
    蓝桥杯官网练习题(旋转)
    leetcode 754. 到达终点数字
    论微软过程
  • 原文地址:https://blog.csdn.net/yusude123456/article/details/132925031