<style>
html, body, .ui-content {
background: #222222;
color: #00BFFF;
}
::-webkit-scrollbar {
width: 10px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, #2BE8CF60 0%, #2B83E860 100%);
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: linear-gradient(180deg, #2BE8CF95 0%, #2B83E895 100%);
}
/* 設定 code 模板 */
.markdown-body code,
.markdown-body tt {
background-color: #ffffff36;
}
.markdown-body .highlight pre,
.markdown-body pre {
color: #ddd;
background-color: #00000036;
}
.hljs-tag {
color: #ddd;
}
.token.operator {
background-color: transparent;
}
</style>
###### tags: `Leetcode`
# 1129. Shortest Path with Alternating Colors
###### Link : https://leetcode.com/problems/shortest-path-with-alternating-colors/description/
## 題目
找到最短路徑,且路徑必須是藍色紅色交替的走
## 程式碼
```cpp=
enum color{Red = 0, Blue};
class Solution {
public:
vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& redEdges, vector<vector<int>>& blueEdges) {
vector<int> ans(n, -1);//ans預設皆-1
vector<vector<int>> redAdj(n), blueAdj(n);
for(auto &it : redEdges)//紅色的adjList
redAdj[it[0]].push_back(it[1]);
for(auto &it : blueEdges)//藍色的adjList
blueAdj[it[0]].push_back(it[1]);
BFS(ans, redAdj, blueAdj, Red);//紅色為開頭
BFS(ans, redAdj, blueAdj, Blue);//藍色為開頭
return ans;
}
private:
void BFS(vector<int> &ans, vector<vector<int>> redAdj, vector<vector<int>> blueAdj, color Color){
queue<int> q;
q.push(0);//起點為0
int cnt = 0;//步數
while(!q.empty()){
int size = q.size();//第cnt步須從queue拿出多少
for(int i = 0;i < size;++i){
int cur = q.front(); q.pop();
if(ans[cur] == -1 || ans[cur] > cnt)//如果沒走過或是這次的步數比較短
ans[cur] = cnt;//更新ans
if(Color == Red){
for(int &it : redAdj[cur])
q.push(it);//所有可以走的路放進queue
redAdj[cur].clear();//走過的路刪掉
}
else{
for(int &it : blueAdj[cur])
q.push(it);//所有可以走的路放進queue
blueAdj[cur].clear();//走過的路刪掉
}
}
++cnt;
size = q.size();//第cnt步須從queue拿出多少
for(int i = 0;i < size;++i){
int cur = q.front(); q.pop();
if(ans[cur] == -1 || ans[cur] > cnt)//如果沒走過或是這次的步數比較短
ans[cur] = cnt;//更新ans
if(Color == Red){
for(int &it : blueAdj[cur])
q.push(it);//所有可以走的路放進queue
blueAdj[cur].clear();//走過的路刪掉
}
else{
for(int &it : redAdj[cur])
q.push(it);//所有可以走的路放進queue
redAdj[cur].clear();//走過的路刪掉
}
}
++cnt;
}
}
};
```