给定一组 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; }