Leetcode(886)-可能的二分法


給定一組 N 人(編號為 1, 2, ..., N), 我們想把每個人分進任意大小的兩組。

每個人都可能不喜歡其他人,那么他們不應該屬於同一組。

形式上,如果 dislikes[i] = [a, b],表示不允許將編號為 a 和 b 的人歸入同一組。

當可以用這種方法將每個人分進兩組時,返回 true;否則返回 false

示例 1:

輸入:N = 4, dislikes = [[1,2],[1,3],[2,4]]
輸出:true
解釋:group1 [1,4], group2 [2,3]

示例 2:

輸入:N = 3, dislikes = [[1,2],[1,3],[2,3]]
輸出:false

示例 3:

輸入:N = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]
輸出:false

思路:這是用染色圖判斷二分圖的題目。

 判斷二分圖的常見方法是染色法: 開始對任意一未染色的頂點染色,之后判斷其相鄰的頂點中,若未染色則將其染上和相鄰頂點不同的顏色, 若已經染色且顏色和相鄰頂點的顏色相同則說明不是二分圖,若顏色不同則繼續判斷,bfs和dfs可以搞定!

vector<int> v[2005];
    int color[2005];
    bool dfs(int a,int col){
        color[a]=col;
        int ok=1;
        for(auto it:v[a]){
            if(color[it]==-1){
                ok&=dfs(it,col^1);
            }
            else if(color[it]!=(col^1)){
                ok=0;
            }
        }
        return ok;
    }
    bool possibleBipartition(int N, vector<vector<int>>& dislikes) {
        for(auto it:dislikes){
            v[it[0]].push_back(it[1]);
            v[it[1]].push_back(it[0]);
        }
        memset(color,-1,sizeof(color));
        int ok=1;
        for(int i=1;i<=N;i++){
            if(color[i]==-1)
                ok&=dfs(i,1);
        }
        return ok;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM