最大の独立集合問題
独立集合は、そのサブセット内の2つのノード間にエッジがない場合、すべての二分木ノードのサブセットです。
ここで、要素のセットから、最長の独立集合を見つけます。つまり、要素を使用してバイナリツリーを形成する場合、すべての最大のサブセットであり、そのサブセット内の要素は相互に接続されていません。
入力と出力
Input: A binary tree. Output: Size of the Largest Independent Set is: 5
アルゴリズム
longSetSize(root)
このアルゴリズムでは、バイナリツリーが形成され、そのツリーの各ノードがデータとsetSizeを保持します。
入力- 二分木のルートノード。
出力- 最長のセットのサイズ。
Begin if root = φ, then return 0 if setSize(root) ≠ 0, then setSize(root) if root has no child, then setSize(root) := 1 return setSize(root) setSizeEx := longSetSize(left(root)) + longSetSize(right(root)) //excluding root setSizeIn := 1 if left child exists, then setSizeIn := setSizeIn + longSetSize(left(left(root))) + longSetSize(left(right(root))) if right child exists, then setSizeIn := setSizeIn + longSetSize(right(left(root))) + longSetSize(right(right(root))) if setSizeIn > setSizeEx, then setSize(root) := setSizeIn else setSize(root) := setSizeEx return setSize(root) End
例
#include <iostream> using namespace std; struct node { int data; int setSize; node *left, *right; }; int longSetSize(node *root) { if (root == NULL) return 0; if (root->setSize != 0) return root->setSize; if (root->left == NULL && root->right == NULL) //when there is no child return (root->setSize = 1); // set size exclusive root is set size of left and set size of right int setSizeEx = longSetSize(root->left) + longSetSize(root->right); int setSizeIn = 1; //inclusive root node if (root->left) //if left sub tree is present setSizeIn += longSetSize(root->left->left) + longSetSize(root->left->right); if (root->right) //if right sub tree is present setSizeIn += longSetSize(root->right->left) +longSetSize(root->right->right); root->setSize = (setSizeIn>setSizeEx)?setSizeIn:setSizeEx; return root->setSize; } struct node* getNode(int data) { //create a new node with given data node* newNode = new node; newNode->data = data; newNode->left = newNode->right = NULL; newNode->setSize = 0; return newNode; } int main() { node *root = getNode(20); root->left = getNode(8); root->left->left = getNode(4); root->left->right = getNode(12); root->left->right->left = getNode(10); root->left->right->right = getNode(14); root->right = getNode(22); root->right->right = getNode(25); cout << "Size of the Largest Independent Set is: " << longSetSize(root); }
出力
Size of the Largest Independent Set is − 5
-
無向グラフにC++で指定されたサイズの独立集合が含まれているかどうかを確認します
コンセプト 与えられた無向グラフに関して、サイズlの独立集合が含まれているかどうかを確認します。サイズlの独立集合が存在する場合は「はい」と印刷し、そうでない場合は「いいえ」と印刷します。グラフの独立集合は、互いに直接接続されていない頂点の集合として定義されることに注意してください。 入力 L = 4, graph = [[1, 0, 1, 0, 0], [0, 1, 1, 0, 0],[1, 1, 1, 1, 1], [0, 0, 1, 1, 0],[0, 0, 1, 0, 1]]; 出力 Yes 上のグラフには、サイズ4の独立したセットが含まれています(頂点0、1、3、4は互いに
-
無向グラフにPythonで指定されたサイズの独立集合が含まれているかどうかを確認します
与えられた無向グラフがあるとしましょう。サイズlの独立集合が含まれているかどうかを確認する必要があります。サイズlの独立したセットがある場合は、「はい」を返します。それ以外の場合は「いいえ」を返します。 グラフ内の独立集合は、互いに直接接続されていない頂点の集合として定義されていることに注意する必要があります。 したがって、入力がL =4のような場合、 その場合、出力はyesになります これを解決するには、次の手順に従います- 関数is_valid()を定義します。これはグラフを取ります、arr 0からarrのサイズまでの範囲のiの場合、実行します i + 1