题目链接

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]相同即可

class Solution {
public:
//方法二:种类并查集
vector<int> fa;
int findroot(int x){
if(fa[x]==x) return x;
return fa[x]=findroot(fa[x]);
}
void merge(int a,int b){
a=findroot(a);
b=findroot(b);
fa[a]=b;
}
bool possibleBipartition(int N, vector<vector<int>>& dislikes){
fa=vector<int>(N*2+1,0);//开两倍空间(a,b+N),(b,a+N)来存
//初始化fa[]数组
for(int i=1;i<=2*N;i++) fa[i]=i; for(vector<int> tmp:dislikes){
int x=findroot(tmp[0]);
int y=findroot(tmp[1]);
if(x==y) return false;
//合并(a,b+N)
merge(tmp[0],tmp[1]+N);
merge(tmp[1],tmp[0]+N);
}
return true;
} //方法一:
//DFS + 染色
// vector<int> col;//染色
// vector<unordered_set<int>> ed;
// bool dfs(int c,int k){
// col[k]=c;
// for(auto it=ed[k].begin();it!=ed[k].end();it++){
// if(col[*it]==col[k]) return false;
// if(!col[*it] && !dfs(-1*c,*it)) return false;
// }
// return true;
// }
// bool possibleBipartition(int N, vector<vector<int>>& dislikes){
// col=vector<int>(N+1,0);//N个节点的颜色
// ed=vector<unordered_set<int>>(N+1); // for(vector<int> tmp:dislikes){
// ed[tmp[0]].insert(tmp[1]);
// ed[tmp[1]].insert(tmp[0]);//创立邻接链表
// } // for(int i=1;i<=N;i++){
// if(!col[i] && !dfs(1,i)) return false;
// } // return true;
// } // static bool cmp(vector<int> a,vector<int> b){
// if(a[0]==b[0]) return a[1]<b[1];
// return a[0]<b[0];
// }
// bool possibleBipartition(int N, vector<vector<int>>& dislikes) {
// vector<vector<int>> ans;
// for(vector<int> tmp:dislikes){
// if(tmp[0]>tmp[1]) swap(tmp[1],tmp[0]);
// ans.push_back(tmp);
// } // sort(ans.begin(),ans.end());
// set<int> s1,s2;
// for(vector<int> tmp:ans){
// if(s1.count(tmp[1]) || s2.count(tmp[0])) return false;
// s1.insert(tmp[0]);
// s2.insert(tmp[1]);
// }
// return true;
// }
};

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. 精尽Spring MVC源码分析 - WebApplicationContext 容器的初始化

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  2. Python最会变魔术的魔术方法,我觉得是它!

    在上篇文章中,我有一个核心的发现:Python 内置类型的特殊方法(含魔术方法与其它方法)由 C 语言独立实现,在 Python 层面不存在调用关系. 但是,文中也提到了一个例外:一个非常神秘的魔术方 ...

  3. GET和POST的区别与联系

    每日知识-GET和POST HTTP:超文本传输协议 组成部分:请求行,请求头部,一个空行,请求数据 GET和POST GET:get就是获取的意思,默认的HTTP请求方式,把参数通过 key/val ...

  4. vue 属性绑定 v-bind

    属性绑定 v-bind 可以通过v-bind将属性值与数据绑定,这样就可以统一化管理 通过这样我们就可以直接访问跳转到百度页面 同样的这个值我们也可以通过事件进行改变 这样就可以方便我们做一些其它的操 ...

  5. mini-web框架-WSGI-mini-web框架-多进程,面向对象的服务器(5.1.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 使用多进程 积极主动python多进程是复制资源,线程是共享变量 所以这个的socket要关两次,因为复制文件的时候,是把文件的fd给复制过去(fil ...

  6. Thymeleaf是个什么东东?

    Thymeleaf是面向Web和独立环境的现代服务器端Java模板引擎,能够处理HTML,XML,JavaScript,CSS甚至纯文本. Thymeleaf的主要目标是提供一个优雅和高度可维护的创建 ...

  7. Python利用openpyxl带格式统计数据(1)- 处理excel数据

    统计数据的随笔写了两篇了,再来一篇,这是第三篇,前面第一篇是用xlwt写excel数据,第二篇是用xlwt写mysql数据.先贴要处理的数据截图: 再贴最终要求的统计格式截图: 第三贴代码: 1 '' ...

  8. Js 添加cookie,写入cookie到主域

    if (getCookie("content") != null && getCookie("content") != "" ...

  9. Windows 安装 Go语言开发环境

    Windows 安装 Go语言开发环境   下载安装包 下载地址:http://www.golangtc.com/download   32 位请选择名称中包含 windows-386 的 msi 安 ...

  10. 图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应

    作者简介   李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络 ...