C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で可能な2分割


N人のセット(1、2、...、Nの番号が付けられている)があるとすると、すべての人を任意のサイズの2つのサブグループに分割します。今、各人は他の人を嫌うかもしれません、そして彼らは同じグループに入るべきではありません。したがって、dislikes [i] =[a、b]の場合、aとbの番号が付けられた人々を同じグループに入れることは許可されていないことを示します。この方法で全員を2つのグループに分割できるかどうかを確認する必要があります。

したがって、入力がN =4で、嫌い=[[1,2]、[1,3]、[2,4]]の場合、出力はtrueになり、グループは[1,4]と[2]になります。 、3]。

これを解決するには、次の手順に従います-

  • グループと呼ばれるセットの配列を作成します。2つのグループがあります

  • dfs()というメソッドを作成します。これにより、ノード、配列グラフ、およびx

    が取得されます。
  • aux:=1 – x

  • groups [aux]にノードがある場合は、falseを返します

  • グループにノードを挿入します[x]

  • 0からグラフのサイズ[ノード]– 1

    の範囲のiの場合
    • u:=グラフ[ノード、i]

    • groups [aux]にuがなく、dfs(u、graph、aux)がfalseの場合、falseを返します

  • それ以外の場合はtrueを返します

  • メインの方法から、次のようにします-

  • サイズ[N+1]

    のグラフと呼ばれる配列を作成します
  • 0から嫌いなもののサイズまでの範囲のiの場合-1

    • u:=嫌い[i、0]、v:=嫌い[i、1]

    • vをgraph[u]に挿入し、uをgraph [v]

      に挿入します
  • 1からNの範囲のiの場合

    • groups [0]にiが含まれておらず、groups [1]にiがない場合、

      • dfs(i、graph、0)がfalseの場合、falseを返します

  • 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

  1. C++の対角トラバースII

    numsというリストのリストがあるとすると、numsのすべての要素を対角線順に表示する必要があります。 したがって、入力が次のような場合 その場合、出力は[1,6,2,8,7,3,9,4,12,10,5,13,​​11,14,15,16]になります。 これを解決するには、次の手順に従います- 配列retを定義する 1つの2Dアレイvを定義する 初期化i:=0の場合、i

  2. C++でプロセスを強制終了します

    n個のプロセスがあるとします。ここでは、各プロセスにPIDまたはプロセスIDと呼ばれる一意のIDがあり、そのPPID(親プロセスID)もそこにあります。 各プロセスには1つの親プロセスしかありませんが、1つ以上の子プロセスがある場合があります。 これは木の構造のようなものです。 PPID =0のプロセスは1つだけです。これは、このプロセスに親プロセスがないことを意味します。すべてのPIDは一意の正の整数になります。 プロセスのリストを表すために2つの整数のリストを使用します。最初のリストには、各プロセスのPIDが含まれ、2番目のリストには対応するPPIDが含まれます。したがって、2つのリ