1042. 不鄰接植花

有 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;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章