转自:https://blog.csdn.net/QingyunAlgo/article/details/82106963
题目: 有N个人,编号从1到N。现在我们试图把他们分成两组。一个人可能不喜欢某些人,那么这个人和他不喜欢的人不能分到一组。输入一个数组dislikes,数组的第i项dislikes[i] = [a, b]表示编号为a的人不喜欢编号为b的人,因此他们不能分到同一组。请根据dislikes关系判断输入的N个人能否分到两个组里?
输入: N个人,一个二维数组 dislikes
输出:true or false
别人思路: 要想解决这个问题,首先我们要发现这个题目是关于图的问题。每个人是图中的一个节点。如果一个人a不喜欢另一个人b,那么a与b之间有一条边相连。在这个题目中a不喜欢b意味着a、b不能分到同一组。不管b是否不喜欢a,只要a不喜欢b他们就不能放在同一组里。因此这个图是无向图。如果看成有向图,只要从a到b有一条边,那么从b到a也有一条边。

如果这些人能够分成两组,我们可以想象这些人在图中对应的节点能够用两种颜色标记。分到第一组的人用颜色c1标记,另一组的人用颜色c2标记。接着我们考虑怎么给图中每个节点标记颜色。

最开始的时候每个节点都没有标记颜色。我们逐个扫描图中的节点,如果发现一个节点p没有被标记过颜色,那么给他标记颜色c1。接着我们看这个节点p都有哪些节点和它相邻,如果相邻的节点q之前没有标记过颜色,我们给它们标记成c2。这是因为p和q相邻,表示他们之间相互不喜欢,不能分在同一组,因此不能用相同的颜色标记。如果节点q之前已经被标记过颜色了,那么看之前标记的是什么颜色。如果之前标记的是c2,那么没有必要再重复标记了。如果之前标记的颜色是c1,那么出现冲突了,一个人不能分到两个组里,因此我们不能按照这个分组规则把所有人分成两组。

接下来我们再从节点q出发去,把和它相邻的节点标记颜色c1,再以此类推。这就是一个深度优先搜索的过程。下面是基于图的深度优先搜索的参考代码:

class Solution {public boolean possibleBipartition(int N, int[][] dislikes) {HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>() ;int key ;for(int i=1;i<=N;i++){List<Integer> list = new ArrayList<Integer>() ;map.put(i, list) ;}for(int i=0;i<dislikes.length;i++){key = dislikes[i][0] ;map.get(key).add(dislikes[i][1]) ;if(!map.get(dislikes[i][1]).contains(key)){map.get(dislikes[i][1]).add(key) ;}}int colors[] = new int[N+1] ;Arrays.fill(colors, -1);for(int i=1;i<=N;i++){if(colors[i] == -1 && !dfs(map, colors, i, 0)){return false ;}}return true ;}public boolean dfs(Map<Integer, List<Integer>> map, int colors[], int index, int value){if(colors[index] != -1){return colors[index] == value ;}colors[index] = value ;int len = map.get(index).size() ;for(int i=0;i<len;i++){if(!dfs(map, colors, map.get(index).get(i), 1-value)){return false ;}}return true ;}
}

leetcode886.PossibleBipartition相关推荐

  1. Acwing LeetCode 题目分类——配套基础课进阶课

    LeetCode 题目分类--配套基础课进阶课 1.基础 二分(满足一个条件的最值问题) LeetCode33 https://leetcode.com/problems/search-in-rota ...

  2. LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 2.3 并查集 1. 题目 给定一组 N 人(编号为 1, 2, -, N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢 ...

  3. Leetcode —— 886. 可能的二分法

    给定一组 N 人(编号为 1, 2, -, N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢其他人,那么他们不应该属于同一组. 形式上,如果 dislikes[i] = [a, b],表 ...

  4. 清华大学尹成 怎么样

    清华大学尹成 怎么样 编程能力极强,算法能力极强,业界的最强算法王者 =============================================================  清华 ...

  5. 并查集(Union-Find)

    并查集(Union-Find) 并查集(Union-Find) 1.初始化 2.查询 3.合并 4.平衡性优化,扁平化 5.按秩合并 6.路径压缩 7.代码 常用模板 [★ 547. 省份数量](ht ...

  6. LeetCode中的那些题

    目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 *******4.寻找两个有序数组的中位数(官方解答) : 5.最长回文子串(官方解答) 15. 三数之和 16. 最接近的三数之和 ...

  7. leetcode 转载

    转载: https://blog.csdn.net/love905661433/article/details/84980135 LeetCode 1- 100 1. 两数之和 : https://b ...

  8. LeedCode 思维训练(二)

    给你一个字符串 s,它由数字('0' - '9')和 '#' 组成.我们希望按下述规则将 s 映射为一些小写英文字符: 字符('a' - 'i')分别用('1' - '9')表示. 字符('j' - ...

  9. 【Leetcode】每日一题打卡(64)

    1619. 删除某些元素后的数组均值 - 简单ac class Solution { public:double trimMean(vector<int>& arr) {sort( ...

最新文章

  1. 模型大十倍,性能提升几倍?谷歌研究员进行了一番研究
  2. AI实时特效,魔幻修图,Adobe Photoshop相机拯救PS菜鸟
  3. 台湾大学林轩田机器学习基石课程学习笔记10 -- Logistic Regression
  4. java.lang.IllegalStateException: Not connected to serve
  5. java 模拟http文件上传,HttpURLConnection上传多文件
  6. DCMTK:OFpath和相关内容的测试程序
  7. 指令篇: 查看系统版本信息___uname
  8. win7旗舰版6l打印机咋安驱动_在w7旗舰版上怎么安装HPlaserjet6L打印机?
  9. js关于浅拷贝、深拷贝,数组的深拷贝
  10. Redis和MongoDB的区别
  11. django中ForeignKey指向自身的方法
  12. 【多多情报通】拼多多个人店铺怎么升级为企业店铺?怎么转让?
  13. Echarts风向玫瑰图
  14. 为什么c语言运行后输入的中文会乱码
  15. r语言导入spss数据_R软件导入数据_r语言怎么导入数据_R软件导入数据
  16. 杰理之录音详细流程框图【篇】
  17. 谈谈Java的学习方法
  18. 记录一下之前写的文章--测试之不可承受之轻
  19. 三级数据库知识点学习(五)
  20. 【论文笔记_自蒸馏_2020】Regularizing Class-wise Predictions via Self-knowledge Distillation

热门文章

  1. python学习--面向过程程序设计实例
  2. vim - multiple windows
  3. MySQL 主从复制与读写分离概念及架构分析
  4. [转]Python中多线程与多进程中的数据共享问题!
  5. 熬夜做出的数据可视化,却被领导臭骂,只因这个......
  6. 去掉源代码里的debug标致
  7. Adobe Flex UIComponent LifeCycle
  8. c++ 全局变量_专业解码 | 带你了解Python全局变量与局部变量!
  9. java进入dos_java启动dos命令收集笔记一
  10. vue里面的mvvm双向绑定(高级语法糖)