Re: [閒聊] 每日LeetCode

作者: idiont (supertroller)   2023-02-11 08:36:29
1129. Shortest Path with Alternating Colors
給 n 個點,紅色的有向邊,藍色的有向邊,可能包含自環或是重邊(顏色不同),
求從 0 號點出發,用交錯邊到每個點的最短路徑,若無法到達則是-1。
Example 1:
Input: n = 3, redEdges = [[0,1],[1,2]], blueEdges = []
Output: [0,1,-1]
Explanation: 從 0 號點只能從紅邊到 1 號點,沒有藍邊可以繼續前往 2 號點
Example 2:
Input: n = 3, redEdges = [[0,1]], blueEdges = [[2,1]]
Output: [0,1,-1]
Explanation: 從 0 號點到 1 號點後,藍邊[2, 1]是有向邊,無法從 1 號到 2 號
解題思路:
對於每個點紀錄由紅邊到達以及藍邊到達的最短路徑,
把存邊的資料結構改成 adjacency lists 會比較容易存取,
從 0 號點開始進行 BFS,出發的邊可以是紅邊也可以是藍邊,
如果是用紅邊到達的點就用藍邊來更新鄰居,藍邊就反過來,
每個點最多只會被更新 2 次。
C++ code:
#define RED 0
#define BLUE 1
class Solution {
public:
vector<int> shortestAlternatingPaths(int n, vector<vector<int>>&
redEdges, vector<vector<int>>& blueEdges) {
vector<vector<int>> dis(n, {INT_MAX, INT_MAX});
vector<vector<int>> red(n, vector<int>()), blue(n, vector<int>());
for(auto i : redEdges)
red[i[0]].push_back(i[1]);
for(auto i : blueEdges)
blue[i[0]].push_back(i[1]);
dis[0] = {0, 0};
queue<pair<int, int>> que; // {node, color}
que.push({0, RED});
que.push({0, BLUE});
while(que.size() > 0){
auto [id, color] = que.front(); que.pop();
if(color == RED){
for(auto i : blue[id]){
if(dis[id][RED] + 1 < dis[i][BLUE]){
dis[i][BLUE] = dis[id][RED] + 1;
que.push({i, BLUE});
}
}
}
else{
for(auto i : red[id]){
if(dis[id][BLUE] + 1 < dis[i][RED]){
dis[i][RED] = dis[id][BLUE] + 1;
que.push({i, RED});
}
}
}
}
vector<int> ans(n);
for(int i = 0; i < n; i++){
ans[i] = min(dis[i][RED], dis[i][BLUE]);
if(ans[i] == INT_MAX) ans[i] = -1;
}
return ans;
}
};
作者: SecondRun (雨夜琴聲)   2023-02-11 08:45:00
大師
作者: Rushia (みけねこ的鼻屎)   2023-02-11 10:35:00
大師

Links booklink

Contact Us: admin [ a t ] ucptt.com