日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)

發(fā)布時(shí)間:2024/7/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 DFS
      • 2.2 BFS
      • 2.3 并查集

1. 題目

給定一組 N 人(編號(hào)為 1, 2, …, N), 我們想把每個(gè)人分進(jìn)任意大小的兩組。

每個(gè)人都可能不喜歡其他人,那么他們不應(yīng)該屬于同一組。

形式上,如果 dislikes[i] = [a, b],表示不允許將編號(hào)為 a 和 b 的人歸入同一組。

當(dāng)可以用這種方法將每個(gè)人分進(jìn)兩組時(shí),返回 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] 對(duì)于 dislikes[i] == dislikes[j] 不存在 i != j

來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/possible-bipartition
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

2. 解題

  • 把人分成2組,組內(nèi)沒(méi)有自己不喜歡的人

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)//顏色相同,出錯(cuò)ans = false;if(color[*it] == 0)//沒(méi)有訪問(wèn)過(guò)的,繼續(xù)著色{color[*it] = nextcol;dfs(*it, nextcol, color);}}} };

528 ms 71.3 MB

2.2 BFS

  • 思路跟dfs一樣,實(shí)現(xiàn)形式不一樣而已
class Solution {unordered_map<int,unordered_set<int>> m; 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]);}queue<int> q;int id, col = 1, nextcol, size;for(int i = 1; i <= N; i++){if(color[i] == 0)//未訪問(wèn)的{color[i] = 1;//著色為1col = 1;q.push(i);while(!q.empty()){size = q.size();nextcol = col==1 ? 2 : 1;//下一層顏色需要變while(size--){id = q.front();q.pop();for(auto it = m[id].begin(); it != m[id].end(); it++){ //相連的,不喜歡的,顏色不能一樣if(color[*it] == col)return false;if(color[*it] == 0){color[*it] = nextcol;//沒(méi)訪問(wèn)的,不喜歡的,顏色跟我不一樣q.push(*it);}}}col = col==1? 2 : 1;//換顏色}}}return true;} };

524 ms 70.9 MB

2.3 并查集

  • 參考 數(shù)據(jù)結(jié)構(gòu)–并查集(Disjoint-Set)

類(lèi)似題目:
LeetCode 684. 冗余連接(并查集)
LeetCode 990. 等式方程的可滿(mǎn)足性(并查集)
LeetCode 959. 由斜杠劃分區(qū)域(并查集)
LeetCode 1202. 交換字符串中的元素(并查集)
LeetCode 1319. 連通網(wǎng)絡(luò)的操作次數(shù)(BFS/DFS/并查集)
程序員面試金典 - 面試題 17.07. 嬰兒名字(并查集)

參考了題解區(qū)大佬們的思路

  • 把并查集大小開(kāi)到2倍的N,左邊是自己的顏色,右邊是自己不喜歡的另一種顏色
  • 當(dāng)a,b互斥時(shí),a 與 b 對(duì)應(yīng)的相反顏色 b+N 應(yīng)該是一致的,進(jìn)行merge(a, b+N)
  • 同理,merge(b, a+N)

class dsu {vector<int> f; public:dsu(int n){f.resize(n+1);for(int i = 0; i < n+1; ++i)f[i] = i;}void merge(int a, int b){int fa = find(a), fb = find(b);f[fa] = fb;}int find(int a)//循環(huán)+路徑壓縮{int origin = a;while(a != f[a])a = f[a];return f[origin] = a;//路徑壓縮} }; class Solution { public:bool possibleBipartition(int N, vector<vector<int>>& dislikes) {if(dislikes.size() <= 2) return true;dsu u(2*N+1);int a, b, da, db;for(auto& d : dislikes){a = d[0];b = d[1];da = a+N;//a的另外一種顏色db = b+N;//b的另外一種顏色if(u.find(a) == u.find(b))return false;u.merge(a,db);//a跟b互斥,那么a跟b的反是一樣的顏色u.merge(b,da);//同理}return true;} };

256 ms 39.6 MB

總結(jié)

以上是生活随笔為你收集整理的LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。