题目链接

886. 可能的二分法

题意:

给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组。

每个人都可能不喜欢其他人,那么他们不应该属于同一组。

形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。

当可以用这种方法将所有人分进两组时,返回 true;否则返回 false。

思路:

  1. 法一:DFS+染色

    首先初始化所有节点的颜色为0,然后给没有染色的节点染上1,给这个节点的相邻节点染色上-1,以此类推,判断相邻的两个节点颜色相同即可

  2. 法二:种类并查集

    如果a和b不能是相同颜色,那么我们可以合并(a,b+N),(b,a+N)为相同颜色,这样每次判断fa[a]和fa[b]相同即可

  1. class Solution {
  2. public:
  3. //方法二:种类并查集
  4. vector<int> fa;
  5. int findroot(int x){
  6. if(fa[x]==x) return x;
  7. return fa[x]=findroot(fa[x]);
  8. }
  9. void merge(int a,int b){
  10. a=findroot(a);
  11. b=findroot(b);
  12. fa[a]=b;
  13. }
  14. bool possibleBipartition(int N, vector<vector<int>>& dislikes){
  15. fa=vector<int>(N*2+1,0);//开两倍空间(a,b+N),(b,a+N)来存
  16. //初始化fa[]数组
  17. for(int i=1;i<=2*N;i++) fa[i]=i;
  18. for(vector<int> tmp:dislikes){
  19. int x=findroot(tmp[0]);
  20. int y=findroot(tmp[1]);
  21. if(x==y) return false;
  22. //合并(a,b+N)
  23. merge(tmp[0],tmp[1]+N);
  24. merge(tmp[1],tmp[0]+N);
  25. }
  26. return true;
  27. }
  28. //方法一:
  29. //DFS + 染色
  30. // vector<int> col;//染色
  31. // vector<unordered_set<int>> ed;
  32. // bool dfs(int c,int k){
  33. // col[k]=c;
  34. // for(auto it=ed[k].begin();it!=ed[k].end();it++){
  35. // if(col[*it]==col[k]) return false;
  36. // if(!col[*it] && !dfs(-1*c,*it)) return false;
  37. // }
  38. // return true;
  39. // }
  40. // bool possibleBipartition(int N, vector<vector<int>>& dislikes){
  41. // col=vector<int>(N+1,0);//N个节点的颜色
  42. // ed=vector<unordered_set<int>>(N+1);
  43. // for(vector<int> tmp:dislikes){
  44. // ed[tmp[0]].insert(tmp[1]);
  45. // ed[tmp[1]].insert(tmp[0]);//创立邻接链表
  46. // }
  47. // for(int i=1;i<=N;i++){
  48. // if(!col[i] && !dfs(1,i)) return false;
  49. // }
  50. // return true;
  51. // }
  52. // static bool cmp(vector<int> a,vector<int> b){
  53. // if(a[0]==b[0]) return a[1]<b[1];
  54. // return a[0]<b[0];
  55. // }
  56. // bool possibleBipartition(int N, vector<vector<int>>& dislikes) {
  57. // vector<vector<int>> ans;
  58. // for(vector<int> tmp:dislikes){
  59. // if(tmp[0]>tmp[1]) swap(tmp[1],tmp[0]);
  60. // ans.push_back(tmp);
  61. // }
  62. // sort(ans.begin(),ans.end());
  63. // set<int> s1,s2;
  64. // for(vector<int> tmp:ans){
  65. // if(s1.count(tmp[1]) || s2.count(tmp[0])) return false;
  66. // s1.insert(tmp[0]);
  67. // s2.insert(tmp[1]);
  68. // }
  69. // return true;
  70. // }
  71. };

leetcode 886. 可能的二分法(DFS,染色,种类并查集)的更多相关文章

  1. NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...

  2. HDU 5285 wyh2000 and pupil(dfs或种类并查集)

    wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Other ...

  3. poj 2492 A Bug's Life 二分图染色 || 种类并查集

    题目链接 题意 有一种\(bug\),所有的交往只在异性间发生.现给出所有的交往列表,问是否有可疑的\(bug\)(进行同性交往). 思路 法一:种类并查集 参考:https://www.2cto.c ...

  4. hdu 5313 Bipartite Graph(dfs染色 或者 并查集)

    Problem Description Soda has a bipartite graph with n vertices and m undirected edges. Now he wants ...

  5. A Bug's Life(种类并查集)(也是可以用dfs做)

    http://acm.hdu.edu.cn/showproblem.php?pid=1829   A Bug's Life Time Limit:5000MS     Memory Limit:327 ...

  6. LightOJ 1009 二分图染色+BFS/种类并查集

    题意:有两个阵营的人,他们互相敌对,给出互相敌对的人,问同个阵营的人最多有多少个. 思路:可以使用种类并查集写.也可以使用使用二分图染色的写法,由于给定的点并不是连续的,所以排序离散化一下,再进行BF ...

  7. 洛谷 P1525 关押罪犯 & [NOIP2010提高组](贪心,种类并查集)

    传送门 解题思路 很显然,为了让最大值最小,肯定就是从大到小枚举,让他们分在两个监狱中,第一个不符合的就是答案. 怎样判断是否在一个监狱中呢? 很显然,就是用种类并查集. 种类并查集的讲解——团伙(很 ...

  8. NOI2001|POJ1182食物链[种类并查集 向量]

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65430   Accepted: 19283 Description ...

  9. POJ1703Find them, Catch them[种类并查集]

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42416   Accepted: ...

随机推荐

  1. 20201205-2 HTML概念与版本

      HTML的基础   HTML称为超文本标记语言,是一种标识性的语言. 它包括一系列标签,通过这些标签可以将网络上的文档格式统一, 使分散的Internet资源连接为一个逻辑整体. HTML文本是由 ...

  2. 测开之数据类型&#183; 第3篇《列表推导式、字典推导式、2种方式创建生成器》

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.列表推导式 二.字典推导式 三.2种方式创建生成器 1.生成器表达式 2.函数里面,通过 y ...

  3. C#中的深度学习(三):理解神经网络结构

    在这篇文章中,我们将回顾监督机器学习的基础知识,以及训练和验证阶段包括哪些内容. 在这里,我们将为不了解AI的读者介绍机器学习(ML)的基础知识,并且我们将描述在监督机器学习模型中的训练和验证步骤. ...

  4. javascript之原型、原型链

    一.原型: 1. 任何函数都有prototype属性(对象才有属性,函数也是对象): 2. 函数的prototype属性的值是个对象,这个对象就是原型(对象): 3. 作用:通过构造函数创建出来的对象 ...

  5. net core cap结合redis+数据库实现最终一致性

    CAP 同时支持使用 RabbitMQ,Kafka,Azure Service Bus 等进行底层之间的消息发送. CAP 目前支持使用 Sql Server,MySql,PostgreSql,Mon ...

  6. 01 . GitLab简介及环境部署

    GitLab简介 最初,该产品名为GitLab,是完全免费的开源软件,按照MIT许可证分发. 2013年7月,产品被拆分为:GitLabCE(社区版)和GitLabEE(企业版),当时,GitLabC ...

  7. 云服务器部署LAMP

    一.安装Apache 1.安装httpd服务: sudo yum install httpd 2.开启服务: sudo systemctl start httpd 3.访问服务器IP成功显示Testi ...

  8. mysql多个TimeStamp设置

    mysql多个TimeStamp设置 2012-11-02 12:58  轩脉刃  阅读(39590)  评论(3)  编辑  收藏 timestamp设置默认值是Default CURRENT_TI ...

  9. spring之ApplicationEvent 事件驱动

    什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些. ApplicationContext则是应用的容器. Sprin ...

  10. Erlang那些事儿第3回之我是函数(fun),万物之源MFA

    Erlang代码到处都是模式匹配,这把屠龙刀可是Erlang的看家本领.独家绝学,之前在<Erlang那些事儿第1回之我是变量,一次赋值永不改变>文章提到过,Erlang一切皆是模式匹配. ...