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

把每一个人看做无向图中的顶点,若是两个不能分到一组,则看做两点间有一条边。code

若是一个连通图知足ip

1. 无环it

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

这两个条件中的一个,咱们就能够经过 将相邻的顶点分配到不一样的组 这个策略来实现二分。class

不能二分的状况是连通图中确定出现了奇数个顶点的环,显然对于这样的环,是没法把全部相邻的顶点分到不一样组的数据

eg 1-2 2-3 3-1 就没法二分di

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

渣代码以下co

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