इस लेख में, हम द्विआधारी खोज का उपयोग करके दिए गए ग्राफ़ के न्यूनतम शीर्ष कवर आकार को खोजने के लिए एक कार्यक्रम पर चर्चा करेंगे।
न्यूनतम शीर्ष आवरण दिए गए ग्राफ़ के शीर्षों का एक समूह है, जिससे कि ग्राफ़ का प्रत्येक किनारा उस सेट के किसी भी शीर्ष पर आपतित हो।
उदाहरण के लिए, ग्राफ़ लें
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