leetocde1129. 颜色交替的最短路径(bfs)
生活随笔
收集整理的這篇文章主要介紹了
leetocde1129. 颜色交替的最短路径(bfs)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在一個有向圖中,節(jié)點(diǎn)分別標(biāo)記為 0, 1, …, n-1。這個圖中的每條邊不是紅色就是藍(lán)色,且存在自環(huán)或平行邊。
red_edges 中的每一個 [i, j] 對表示從節(jié)點(diǎn) i 到節(jié)點(diǎn) j 的紅色有向邊。類似地,blue_edges 中的每一個 [i, j] 對表示從節(jié)點(diǎn) i 到節(jié)點(diǎn) j 的藍(lán)色有向邊。
返回長度為 n 的數(shù)組 answer,其中 answer[X] 是從節(jié)點(diǎn) 0 到節(jié)點(diǎn) X 的紅色邊和藍(lán)色邊交替出現(xiàn)的最短路徑的長度。如果不存在這樣的路徑,那么 answer[x] = -1。
示例 1:
輸入:n = 3, red_edges = [[0,1],[1,2]], blue_edges = []
輸出:[0,1,-1]
代碼
class Solution {public int[] shortestAlternatingPaths(int n, int[][] red_edges, int[][] blue_edges) {int[] res=new int[n];Arrays.fill(res,Integer.MAX_VALUE);Map<Integer,List<Integer>> blue=new HashMap<>();Map<Integer,List<Integer>> red=new HashMap<>();for(int[] r:red_edges)//紅邊的鄰接表{if(!red.containsKey(r[0])) red.put(r[0],new ArrayList<>());red.get(r[0]).add(r[1]);}for(int[] r:blue_edges)//藍(lán)邊的鄰接表{if(!blue.containsKey(r[0])) blue.put(r[0],new ArrayList<>());blue.get(r[0]).add(r[1]);}int rob=1;Queue<Integer> queue=new LinkedList<>();int level=0;boolean[] rf=new boolean[n];//記錄節(jié)點(diǎn)是不是已經(jīng)被紅邊進(jìn)入過boolean[] bf=new boolean[n];//記錄節(jié)點(diǎn)是不是已經(jīng)被藍(lán)邊進(jìn)入過queue.add(0);while (!queue.isEmpty())//以紅邊為開始的bfs{int size=queue.size();for(int i=0;i<size;i++){int cur=queue.poll();res[cur]=Math.min(level,res[cur]);if(rob==1)//下一條邊是紅邊{if(!red.containsKey(cur)) continue;//沒有下一條邊了for(int c:red.get(cur))//滿足條件的下一節(jié)點(diǎn)入隊(duì){if(!rf[c]){queue.offer(c);rf[c]=true;}}}else{//下一條邊是藍(lán)邊if(!blue.containsKey(cur)) continue;for(int c:blue.get(cur)){if(!bf[c]) {queue.offer(c); bf[c]=true;}}}}rob=rob==1?2:1;//替換下一條邊顏色level++;}rob=2;level=0;rf=new boolean[n];bf=new boolean[n];queue.add(0);while (!queue.isEmpty()){int size=queue.size();for(int i=0;i<size;i++){int cur=queue.poll();res[cur]=Math.min(level,res[cur]);if(rob==1){if(!red.containsKey(cur)) continue;for(int c:red.get(cur)){if(!rf[c]){queue.offer(c);rf[c]=true;}}}else{if(!blue.containsKey(cur)) continue;for(int c:blue.get(cur)){if(!bf[c]) {queue.offer(c); bf[c]=true;}}}}rob=rob==1?2:1;level++;}for(int i=0;i<n;i++) if(res[i]==Integer.MAX_VALUE) res[i]=-1;//將不能到達(dá)的節(jié)點(diǎn)置為-1return res;} }總結(jié)
以上是生活随笔為你收集整理的leetocde1129. 颜色交替的最短路径(bfs)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到打死好多老鼠什么预兆
- 下一篇: leetcode1306. 跳跃游戏 I