leetcode 886. 可能的二分法(DFS,染色,种类并查集)
题目链接
题意:
给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组。
每个人都可能不喜欢其他人,那么他们不应该属于同一组。
形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。
当可以用这种方法将所有人分进两组时,返回 true;否则返回 false。
思路:
法一:DFS+染色
首先初始化所有节点的颜色为0,然后给没有染色的节点染上1,给这个节点的相邻节点染色上-1,以此类推,判断相邻的两个节点颜色相同即可法二:种类并查集
如果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,染色,种类并查集)的更多相关文章
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- HDU 5285 wyh2000 and pupil(dfs或种类并查集)
wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Other ...
- poj 2492 A Bug's Life 二分图染色 || 种类并查集
题目链接 题意 有一种\(bug\),所有的交往只在异性间发生.现给出所有的交往列表,问是否有可疑的\(bug\)(进行同性交往). 思路 法一:种类并查集 参考:https://www.2cto.c ...
- hdu 5313 Bipartite Graph(dfs染色 或者 并查集)
Problem Description Soda has a bipartite graph with n vertices and m undirected edges. Now he wants ...
- A Bug's Life(种类并查集)(也是可以用dfs做)
http://acm.hdu.edu.cn/showproblem.php?pid=1829 A Bug's Life Time Limit:5000MS Memory Limit:327 ...
- LightOJ 1009 二分图染色+BFS/种类并查集
题意:有两个阵营的人,他们互相敌对,给出互相敌对的人,问同个阵营的人最多有多少个. 思路:可以使用种类并查集写.也可以使用使用二分图染色的写法,由于给定的点并不是连续的,所以排序离散化一下,再进行BF ...
- 洛谷 P1525 关押罪犯 & [NOIP2010提高组](贪心,种类并查集)
传送门 解题思路 很显然,为了让最大值最小,肯定就是从大到小枚举,让他们分在两个监狱中,第一个不符合的就是答案. 怎样判断是否在一个监狱中呢? 很显然,就是用种类并查集. 种类并查集的讲解——团伙(很 ...
- NOI2001|POJ1182食物链[种类并查集 向量]
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65430 Accepted: 19283 Description ...
- POJ1703Find them, Catch them[种类并查集]
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42416 Accepted: ...
随机推荐
- 开源抓包工具PowerSniff(支持lua,c语言作为脚本实时分析)
做这个程序的意图是wireshark插件编写复杂(虽然也支持lua),而轻量级的工具如smartsniff,minisniff不支持插件化数据分析,各种工具用下来或多或少不顺手.以前写的外挂也都是手工 ...
- K8s 终将废弃 docker,TKE 早已支持 containerd
近日 K8s 官方称最早将在 1.23版本弃用 docker 作为容器运行时,并在博客中强调可以使用如 containerd 等 CRI 运行时来代替 docker.本文会做详细解读,并介绍 dock ...
- centos7下安装iostat命令
[root@node01 yum.repos.d]# yum intall -y sysstat Loaded plugins: fastestmirror No such command: inta ...
- MySQL锁(一)全局锁:如何做全库的逻辑备份?
数据库锁设计的初衷是处理并发问题,这也是数据库与文件系统的最大区别. 根据加锁的范围,MySQL里大致可以分为三种锁:全局锁.表锁和行锁.接下来我们会分三讲来介绍这三种锁,今天要讲的是全局锁. 全局锁 ...
- 有了Git这个功能,再也不需要依赖IDE了!
大家好,今天给大家介绍一个隐藏的功能--搜索. 我们在写代码的时候经常遇到的一种情况就是,我们想要知道某一个函数是怎么定义的,这样我们才能知道该如何调用它.如果代码少的话我们当然可以自己人肉查找,但是 ...
- AdaBoost 算法-分析波士顿房价数据集
公号:码农充电站pro 主页:https://codeshellme.github.io 在机器学习算法中,有一种算法叫做集成算法,AdaBoost 算法是集成算法的一种.我们先来看下什么是集成算法. ...
- Django使用channels实现Websocket连接
简述: 需求:消息实时推送消息以及通知功能,采用django-channels来实现websocket进行实时通讯.并使用docker.daphne启动通道,保持websocket后台运行 介绍Dja ...
- 2020年下征文+没有计算机经验的宝妈也可以轻松领证一次过关啦 nice !相信努力总会收获
2020年下征文+没有计算机经验的宝妈也可以轻松领证http://www.1634.com.cn/ruankao/forum.php?mod=viewthread&tid=5363&f ...
- 超简单的 Docker部署 SpringBoot项目 步骤
很久之前就用过,一直没有好好写篇博客,今天就总结一下 创建一个 SpringBoot项目 创建一个SpringBoot项目并打成jar包,结构如图 编写 Dockerfile文件 FROM java: ...
- ceph存储集群的应用
1.ceph存储集群的访问接口 1.1ceph块设备接口(RBD) ceph块设备,也称为RADOS块设备(简称RBD),是一种基于RADOS存储系统支持超配(thin-provisioned). ...