Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 가능한 이중 분할

<시간/>

N명의 사람들이 있다고 가정하고(1, 2, ..., N으로 번호가 매겨짐) 모든 사람을 크기에 관계없이 두 개의 하위 그룹으로 나누고 싶습니다. 이제 각 사람은 다른 사람을 싫어할 수 있으며 같은 그룹에 들어가지 않아야 합니다. 따라서 [i] =[a, b]를 싫어하면, b와 번호가 지정된 사람들을 같은 그룹에 넣을 수 없음을 나타냅니다. 이런 식으로 모든 사람을 두 그룹으로 나눌 수 있는지 찾아야 합니다.

따라서 입력이 N =4이고 싫어함 =[[1,2],[1,3],[2,4]]인 경우 출력은 true이고 그룹은 [1,4] 및 [2 ,3].

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 그룹이라는 집합의 배열을 생성합니다. 두 개의 그룹이 있을 것입니다.

  • dfs()라는 메서드를 만듭니다. 이 메서드는 노드, 배열 그래프 및 x

    를 사용합니다.
  • 보조 :=1 – x

  • groups[aux]에 노드가 있으면 false를 반환합니다.

  • 노드를 그룹에 삽입[x]

  • 범위 0에서 그래프[노드] 크기까지의 i에 대해 – 1

    • u :=그래프[노드, i]

    • groups[aux]에 u가 없고 dfs(u, graph, aux)가 false이면 false를 반환합니다.

  • 그렇지 않으면 true를 반환합니다.

  • 주요 방법에서 다음을 수행하십시오 -

  • 크기가 [N + 1]인 그래프라는 배열을 만듭니다.

  • 범위 0에서 싫어요 크기 - 1

    • u :=싫어함[i, 0], v :=싫어함[i, 1]

    • v를 그래프[u]에 삽입하고 u를 그래프[v]에 삽입

  • 범위 1에서 N까지의 i에 대해

    • groups[0]에 i가 없고 groups[1]에 i가 없으면

      • dfs(i, graph, 0)이 거짓이면 거짓을 반환

  • true를 반환합니다.

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   set <int> groups[2];
   bool dfs(int node, vector <int> graph[], int x){
      int aux = 1 - x;
      if(groups[aux].count(node)) return false;
      groups[x].insert(node);
      for(int i = 0; i < graph[node].size(); i++){
         int u = graph[node][i];
         if(!groups[aux].count(u) && !dfs(u, graph, aux)) return false;
      }
      return true;
   }
   bool possibleBipartition(int N, vector<vector<int<<& dislikes) {
      vector <int> graph[N + 1];
      for(int i = 0; i < dislikes.size(); i++){
         int u = dislikes[i][0];
         int v = dislikes[i][1];
         graph[u].push_back(v);
         graph[v].push_back(u);
      }
      for(int i = 1; i <= N;i++){
         if(!groups[0].count(i) && !groups[1].count(i)){
            if(!dfs(i, graph, 0)) return false;
         }
      }
      return true;
   }
};
main(){
   vector<vector<int>> v = {{1,2},{1,3},{2,4}};
   Solution ob;
   cout << (ob.possibleBipartition(4, v));
}

입력

4
[[1,2],[1,3],[2,4]]

출력

true