LeetCode 890 可能的二分法 from weekly contest 97(DFS)

把每个人看作无向图中的顶点,如果两个不能分到一组,则看作两点间有一条边。

如果一个连通图满足

1. 无环

2.有环,并且每个环上的顶点数都为偶数

这两个条件中的一个,我们就可以通过 将相邻的顶点分配到不同的组 这个策略来实现二分。

不能二分的情况是连通图中肯定出现了奇数个顶点的环,显然对于这样的环,是无法把所有相邻的顶点分到不同组的

eg 1-2 2-3 3-1 就无法二分

对于非连通图,要求每一个连通分量满足1或2,但是这个题给的数据可能有点弱,我最开始没有考虑不连通的图的代码也AC了2333

渣代码如下

class Solution {
public:
    bool dfs(int k,vector<int>* gh,vector<int>& vis,int flag)
    {
        vis[k]=flag;
        for(int i=0;i<gh[k].size();i++)
                if(vis[gh[k][i]]==flag) return false;
                            //两个相邻顶点在同一组,即奇数长度的环,不能二分
                else if(!vis[gh[k][i]]&&!dfs(gh[k][i],gh,vis,-flag)) return false;
                                //-flag将相邻的边分到不同组
        return true;
    }
    bool possibleBipartition(int N, vector<vector<int>>& dislikes) {
        if(N<=2) return true;//一个人或者两个人肯定可以a~~~
        vector<int> vis(N+1,0),gh[2001];
        for(int i=0;i<dislikes.size();i++)
        {
            gh[dislikes[i][0]].push_back(dislikes[i][1]);
            gh[dislikes[i][1]].push_back(dislikes[i][0]);
        }//建图
        for(int i=1;i<=N;i++)
            if(!vis[i]&&!dfs(i,gh,vis,1)) 
                return false;
        return true;
    }
};

猜你喜欢

转载自blog.csdn.net/Accsc/article/details/81604669