LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 DFS
- 2.2 BFS
- 2.3 并查集
1. 題目
給定一組 N 人(編號為 1, 2, …, N), 我們想把每個人分進任意大小的兩組。
每個人都可能不喜歡其他人,那么他們不應該屬于同一組。
形式上,如果 dislikes[i] = [a, b],表示不允許將編號為 a 和 b 的人歸入同一組。
當可以用這種方法將每個人分進兩組時,返回 true;否則返回 false。
示例 1: 輸入:N = 4, dislikes = [[1,2],[1,3],[2,4]] 輸出:true 解釋:group1 [1,4], group2 [2,3]示例 2: 輸入:N = 3, dislikes = [[1,2],[1,3],[2,3]] 輸出:false示例 3: 輸入:N = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]] 輸出:false提示: 1 <= N <= 2000 0 <= dislikes.length <= 10000 1 <= dislikes[i][j] <= N dislikes[i][0] < dislikes[i][1] 對于 dislikes[i] == dislikes[j] 不存在 i != j來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/possible-bipartition
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 把人分成2組,組內沒有自己不喜歡的人
2.1 DFS
著色法,初始顏色均為0,著色成1或者2,遇到矛盾的返回 false
class Solution {unordered_map<int,unordered_set<int>> m;bool ans = true; public:bool possibleBipartition(int N, vector<vector<int>>& dislikes) {if(dislikes.size() <= 2) return true;vector<int> color(N+1, 0);for(auto& d : dislikes)//建圖{m[d[0]].insert(d[1]);m[d[1]].insert(d[0]);}for(int i = 1; i <= N; i++){if(color[i] == 0)//未著色的{color[i] = 1;//著色為1dfs(i, 1, color);if(!ans)return false;}}return true;}void dfs(int id, int col, vector<int> &color){if(!ans) return;int nextcol = col==1 ? 2 : 1;//跟我相連的(不喜歡的人)顏色相反for(auto it = m[id].begin(); it != m[id].end(); it++){if(color[*it] == col)//顏色相同,出錯ans = false;if(color[*it] == 0)//沒有訪問過的,繼續著色{color[*it] = nextcol;dfs(*it, nextcol, color);}}} };528 ms 71.3 MB
2.2 BFS
- 思路跟dfs一樣,實現形式不一樣而已
524 ms 70.9 MB
2.3 并查集
- 參考 數據結構–并查集(Disjoint-Set)
類似題目:
LeetCode 684. 冗余連接(并查集)
LeetCode 990. 等式方程的可滿足性(并查集)
LeetCode 959. 由斜杠劃分區域(并查集)
LeetCode 1202. 交換字符串中的元素(并查集)
LeetCode 1319. 連通網絡的操作次數(BFS/DFS/并查集)
程序員面試金典 - 面試題 17.07. 嬰兒名字(并查集)
參考了題解區大佬們的思路
- 把并查集大小開到2倍的N,左邊是自己的顏色,右邊是自己不喜歡的另一種顏色
- 當a,b互斥時,a 與 b 對應的相反顏色 b+N 應該是一致的,進行merge(a, b+N)
- 同理,merge(b, a+N)
256 ms 39.6 MB
總結
以上是生活随笔為你收集整理的LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 895. 最大频率栈(
- 下一篇: LeetCode 457. 环形数组循环