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:

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+" ");
    };



        }
相关推荐
章小幽5 分钟前
LeetCode-35.搜索插入位置
数据结构·算法·leetcode
科技块儿7 分钟前
多语言技术栈如何共用IP离线库?Java、Python、Go 的加载实践
java·python·tcp/ip
放下华子我只抽RuiKe521 分钟前
机器学习全景指南-探索篇——发现数据内在结构的聚类算法
人工智能·深度学习·算法·机器学习·语言模型·数据挖掘·聚类
chools22 分钟前
一篇文章带你搞懂Java“设计模式”! - - 超长文(涵盖23种)万字总结!【汇总篇】
java·开发语言·设计模式
良逍Ai出海23 分钟前
OpenClaw 新手最该先搞懂的 2 套命令
android·java·数据库
6+h30 分钟前
【Spring】深度剖析IoC
java·后端·spring
Yupureki35 分钟前
《C++实战项目-高并发内存池》3.ThreadCache构造
服务器·c语言·c++·算法·哈希算法
程序员JerrySUN40 分钟前
别再把 HTTPS 和 OTA 看成两回事:一篇讲透 HTTPS 协议、安全通信机制与 Mender 升级加密链路的完整文章
android·java·开发语言·深度学习·流程图
j_xxx404_40 分钟前
C++算法:一维/二维前缀和算法模板题
开发语言·数据结构·c++·算法
x_xbx43 分钟前
LeetCode:111. 二叉树的最小深度
算法·leetcode·职场和发展