把每个人看作无向图中的顶点,如果两个不能分到一组,则看作两点间有一条边。
如果一个连通图满足
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;
}
};