給定一組 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
思路:這是用染色圖判斷二分圖的題目。
判斷二分圖的常見方法是染色法: 開始對任意一未染色的頂點染色,之后判斷其相鄰的頂點中,若未染色則將其染上和相鄰頂點不同的顏色, 若已經染色且顏色和相鄰頂點的顏色相同則說明不是二分圖,若顏色不同則繼續判斷,bfs和dfs可以搞定!
vector<int> v[2005]; int color[2005]; bool dfs(int a,int col){ color[a]=col; int ok=1; for(auto it:v[a]){ if(color[it]==-1){ ok&=dfs(it,col^1); } else if(color[it]!=(col^1)){ ok=0; } } return ok; } bool possibleBipartition(int N, vector<vector<int>>& dislikes) { for(auto it:dislikes){ v[it[0]].push_back(it[1]); v[it[1]].push_back(it[0]); } memset(color,-1,sizeof(color)); int ok=1; for(int i=1;i<=N;i++){ if(color[i]==-1) ok&=dfs(i,1); } return ok; }