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

猜你喜欢

转载自www.cnblogs.com/mini-coconut/p/9495633.html