把每一个人看做无向图中的顶点,若是两个不能分到一组,则看做两点间有一条边。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; } };