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: ...
随机推荐
- 开发阶段,将SpringBoot应用快速部署到K8S
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- idea 最好用的插件
1.lombok 不用写get,set方法 2.MyBatisCodeHelperPro 3.Rainbow Brackets 彩虹括号 5.activate-power-mode 动感打字 7.Ba ...
- 职场PUA,管理者的五宗罪
在目前的社会环境下,程序员似乎成了"弱势群体".我们经常谈论的职场PUA已经成为程序员的代名词. 我一直在想,为什么这么多管理者能力会这么差. 但最后最吃亏的还是可怜的程序员. 也 ...
- [GXYCTF2019]禁止套娃(无参RCE)
[GXYCTF2019]禁止套娃 1.扫描目录 扫描之后发现git泄漏 使用githack读取泄漏文件 <?php include "flag.php"; echo &quo ...
- Hibernate实现对数据的CRUD
今天主要去看公司的老框架, CRUD用的较多,所以总结一下步骤,以免忘记的时候温习 回顾 JDBC 工作过程: 加载驱动 建立连接 定义sql,发生sql语句 执行sql语句获得执行结果 处理返回结果 ...
- Java 12 新特性
Java 12 已如期于 3 月 19 日正式发布,此次更新是 Java 11 这一长期支持版本发布之后的一次常规更新,截至目前,Java 半年为发布周期,并且不会跳票承诺的发布模式,已经成功运行一年 ...
- 【剑指offer】00 开撸剑指offer
此篇为刷题链接集合,我会将剑指offer中的每一题单独做一篇随笔,然后将链接加在本篇随笔中. //将用JavaScript解题 剑指offer:https://www.nowcoder.com/ta/ ...
- Ubuntu替换清华源或者阿里源
倒腾pygame包的问题(Ubuntu 19.10),安装好pip后,又要安装一个pygame的包,倒腾了两天两夜,硬是因为网络问题(可能被强大的墙阻挡了),安装不成功,后面在网上找了篇帖子,用清华源 ...
- MySQL中函数总结
SQL中提供的函数: version() 查询当前数据库版本 user() 查询当前登录用户 database() 查询当前所在数据库 uuid() 返回uuid的值,分布式情况下数据库 ...
- python常见的内置模块
python的内置模块: os os.path sys time datetime hashlib base64 hmac random math 一.os模块: os模块是与操作系统交互的一个接口 ...