有 N
個花園,按從 1
到 N
標記。在每個花園中,你打算種下四種花之一。
paths[i] = [x, y]
描述了花園 x
到花園 y
的雙向路徑。
另外,沒有花園有 3 條以上的路徑可以進入或者離開。
你需要爲每個花園選擇一種花,使得通過路徑相連的任何兩個花園中的花的種類互不相同。
以數組形式返回選擇的方案作爲答案 answer
,其中 answer[i]
爲在第 (i+1)
個花園中種植的花的種類。花的種類用 1, 2, 3, 4 表示。保證存在答案。
示例 1:
輸入:N = 3, paths = [[1,2],[2,3],[3,1]]
輸出:[1,2,3]
示例 2:
輸入:N = 4, paths = [[1,2],[3,4]]
輸出:[1,2,1,2]
示例 3:
輸入:N = 4, paths = [[1,2],[2,3],[3,4],[4,1],[1,3],[2,4]]
輸出:[1,2,3,4]
提示:
1 <= N <= 10000
0 <= paths.size <= 20000
- 不存在花園有 4 條或者更多路徑可以進入或離開。
- 保證存在答案。
思路:整個問題可以抽象成一個無向圖,每個花園表示圖的頂點,要求相鄰頂點種的花不能一樣。
題目中說,沒有花園有三條以上的路線可以進入或者離開,也就是說,每個頂點的度最多是三。由於一共有四種花,那麼一定可以找到和周圍不一樣的顏色的花。
採用貪心算法,建立二維vector對每一個頂點統計其周圍有哪些頂點,再把這些頂點種過的花去除掉,從剩下的花中選一種。
class Solution {
public:
vector<int> gardenNoAdj(int N, vector<vector<int>>& paths) {
vector<vector<int> >G(N+1);
vector<int>re(N);//注意題目中要求re中存的每個頂點的索引是從0開始的。
for(auto x:paths){//每一個頂點統計其周圍有哪些頂點
G[x[0]].push_back(x[1]);
G[x[1]].push_back(x[0]);
}
for(int i=1; i<=N; ++i){//遍歷每一個頂點,找花種
vector<int>color(5);
for(auto x:G[i]){//遍歷該頂點的每一個相鄰頂點,把這些頂點種的花存在color中
if(re[x-1]) color[re[x-1]]=1;
}
for(int j=1; j<5; ++j){
if(!color[j]){//找到哪一朵花之前沒被種過
re[i-1]=j;
}
}
}
return re;
}
};