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

二分探索を使用してグラフの最小頂点被覆サイズを見つけるC++プログラム


この記事では、二分探索を使用して特定のグラフの最小頂点被覆サイズを見つけるプログラムについて説明します。

最小頂点被覆は、グラフ内のすべてのエッジがそのセット内のいずれかの頂点に入射するように、指定されたグラフの頂点のセットです。

たとえば、グラフを見てください

2 ---- 4 ---- 6
|     |
|     |
|     |
3 ---- 5

ここで、最小頂点被覆には頂点3と4が含まれます。グラフのすべてのエッジは、グラフの3つまたは4つの頂点に入射します。

#include<bits/stdc++.h>
using namespace std;
#define max 15
//array to store graph
bool arr[max][max];
//check if minimum vertex cover exists
bool check_cover(int V, int k, int E) {
   int set = (1 << k) - 1;
   int limit = (1 << V);
   //to mark the edges of size 'k'
   bool vis[max][max];
   while (set < limit) {
      //resetting the vertex cover for each iteration
      memset(vis, 0, sizeof vis);
      int count = 0;
      //checking the values which has a high value
      for (int j = 1, v = 1 ; j < limit ; j = j << 1, v++) {
         if (set & j) {
            //marking the edges visited
            for (int k = 1 ; k <= V ; k++) {
               if (arr[v][k] && !vis[v][k]) {
                  vis[v][k] = 1;
                  vis[k][v] = 1;
                  count++;
               }
            }
         }
      }
      //if all the edges are covered
      if (count == E)
         return true;
      int c = set & -set;
      int r = set + c;
      set = (((r^set) >> 2) / c) | r;
   }
   return false;
}
//to find minimum vertex cover
int find_cover(int n, int m) {
   //performing binary search
   int left = 1, right = n;
   while (right > left){
      int mid = (left + right) >> 1;
      if (check_cover(n, mid, m) == false)
         left = mid + 1;
      else
         right = mid;
   }
   return left;
}
//inserting edge in the graph
void add_edge(int u, int v) {
   arr[u][v] = 1;
   arr[v][u] = 1;
}
int main() {
   memset(arr, 0, sizeof arr);
   int V = 6, E = 5;
   add_edge(2, 3);
   add_edge(2, 4);
   add_edge(3, 5);
   add_edge(4, 5);
   add_edge(4, 6);
   cout << "Size of Minimum Vertex Cover : " << find_cover(V, E) << endl;
   return 0;
}

出力

Size of Minimum Vertex Cover : 2

  1. C++でバイナリ検索ツリーのInorderSuccessorを検索するプログラム

    二分探索木BSTとノードの別の値があるとすると、BSTでそのノードの順序どおりの後続を見つける必要があります。ノードpの後継は、pの値よりも大きい最小のキーを持つノードであることは誰もが知っています。 したがって、入力が次のような場合 そして、p =1の場合、出力は2になります これを解決するには、次の手順に従います- 再帰的メソッドinorderSuccessor()を定義します。これは、ルートとpを取得します ルートがnullの場合、次のようになります。 nullを返す ルートの値<=pの値の場合: return inorderSuccessor(rootの権利、p)

  2. C ++プログラムでの二分探索?

    二分探索は、半区間探索、対数探索、または二分探索とも呼ばれ、ソートされた配列内のターゲット値の位置を見つける検索アルゴリズムです。二分探索は、ターゲット値を配列の中央の要素と比較します。それらが等しくない場合、ターゲットが存在できない半分が削除され、残りの半分で検索が続行され、再び中央の要素がターゲット値と比較され、ターゲット値が見つかるまでこれが繰り返されます。残りの半分が空の状態で検索が終了した場合、ターゲットは配列に含まれていません。アイデアは単純ですが、バイナリ検索を正しく実装するには、特に配列の値が範囲内の整数のすべてではない場合、終了条件と中間点の計算に関する微妙な点に注意する必要