Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में क्रुस्कल का न्यूनतम स्पैनिंग ट्री एल्गोरिथम-लालची एल्गोरिथम

एक फैले हुए पेड़ एक जुड़ा हुआ और अप्रत्यक्ष ग्राफ सबग्राफ है जो सभी शीर्षकों को जोड़ता है। कई फैले हुए पेड़ एक ग्राफ में मौजूद हो सकते हैं। प्रत्येक ग्राफ पर न्यूनतम फैले हुए पेड़ (MST) का वजन अन्य सभी फैले हुए पेड़ों की तुलना में समान या कम होता है। वजन फैले हुए पेड़ों के किनारों को सौंपा गया है और योग प्रत्येक किनारे को सौंपा गया वजन है। चूँकि V ग्राफ़ में शीर्षों की संख्या है, न्यूनतम फैले हुए पेड़ के किनारे (V-1) हैं, जहाँ V किनारों की संख्या है।

क्रुस्कल के एल्गोरिथम का उपयोग करके न्यूनतम फैले हुए पेड़ ढूँढना

  • सभी किनारों को भार के अवरोही क्रम में व्यवस्थित किया जाना चाहिए।

  • सबसे छोटा किनारा चुनें। यदि चक्र नहीं बनता है तो इस किनारे को शामिल किया जाता है।

  • चरण 2 तब तक किया जाना चाहिए जब तक फैले हुए पेड़ में (V-1) किनारे न हों।

इस परिदृश्य में, हमें लालची पद्धति का उपयोग करने के लिए कहा जाता है। लालची विकल्प कम से कम वजन वाले किनारे का चयन करना है। उदाहरण के तौर पर:इस ग्राफ़ के लिए न्यूनतम फैले हुए पेड़ (9-1)=8 किनारे हैं।

C++ में क्रुस्कल का न्यूनतम स्पैनिंग ट्री एल्गोरिथम-लालची एल्गोरिथम

After sorting:

Weight  Src    Dest
21       27    26
22       28    22
22       26    25
24       20    21
24       22    25
26       28    26
27       22    23
27       27    28
28       20    27
28       21    22
29       23    24
30       25    24
31       21    27
34       23    25

अब हमें क्रम के अनुसार सभी किनारों को चुनना होगा।

किनारा 26-27-> शामिल है क्योंकि कोई चक्र नहीं बनता है

एज 28-22-> शामिल है क्योंकि कोई चक्र नहीं बनता है

किनारा 26-25-> शामिल है क्योंकि कोई चक्र नहीं बनता है।

धार 20-21-> शामिल है क्योंकि कोई चक्र नहीं बनता है

किनारा 22-25-> शामिल है क्योंकि कोई चक्र नहीं बनता है।

धार 28-26-> चक्र बनने पर फेंक दिया जाता है

धार 22-23-> शामिल है क्योंकि कोई चक्र नहीं बनता है

धार 27-28-> चक्र बनने पर त्याग दिया जाता है

धार 20-27-> शामिल है क्योंकि कोई चक्र नहीं बनता है

धार 21-22-> चक्र बनने पर फेंक दिया जाता है

एज 23-24-> शामिल है क्योंकि कोई चक्र नहीं बनता है

चूंकि किनारों की संख्या (V-1) है, इसलिए एल्गोरिथम यहां समाप्त होता है।

उदाहरण

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Edge {
   int src, dest, weight;
};
struct Graph {
   int V, E;
   struct Edge* edge;
};
struct Graph* createGraph(int V, int E){
   struct Graph* graph = (struct Graph*)(malloc(sizeof(struct Graph)));
   graph->V = V;
   graph->E = E;
   graph->edge = (struct Edge*)malloc(sizeof( struct Edge)*E);
   return graph;
}
struct subset {
   int parent;
   int rank;
};
int find(struct subset subsets[], int i){
   if (subsets[i].parent != i)
      subsets[i].parent
   = find(subsets, subsets[i].parent);
   return subsets[i].parent;
}
void Union(struct subset subsets[], int x, int y){
   int xroot = find(subsets, x);
   int yroot = find(subsets, y);
   if (subsets[xroot].rank < subsets[yroot].rank)
      subsets[xroot].parent = yroot;
   else if (subsets[xroot].rank > subsets[yroot].rank)
      subsets[yroot].parent = xroot;
   else{
      subsets[yroot].parent = xroot;
      subsets[xroot].rank++;
   }
}
int myComp(const void* a, const void* b){
   struct Edge* a1 = (struct Edge*)a;
   struct Edge* b1 = (struct Edge*)b;
   return a1->weight > b1->weight;
}
void KruskalMST(struct Graph* graph){
   int V = graph->V;
   struct Edge
   result[V];
   int e = 0;
   int i = 0;
   qsort(graph->edge, graph->E, sizeof(graph->edge[0]), myComp);
   struct subset* subsets
   = (struct subset*)malloc(V * sizeof(struct subset));
   for (int v = 0; v < V; ++v) {
      subsets[v].parent = v;
      subsets[v].rank = 0;
   }
   while (e < V - 1 && i < graph->E) {
      struct Edge next_edge = graph->edge[i++];
      int x = find(subsets, next_edge.src);
      int y = find(subsets, next_edge.dest);
      if (x != y) {
         result[e++] = next_edge;
         Union(subsets, x, y);
      }
   }
   printf("Following are the edges in the constructed MST\n");
   int minimumCost = 0;
   for (i = 0; i < e; ++i){
      printf("%d -- %d == %d\n", result[i].src,
      result[i].dest, result[i].weight);
      minimumCost += result[i].weight;
   }
   printf("Minimum Cost Spanning tree : %d",minimumCost);
   return;
}
int main(){
   /* Let us create the following weighted graph
   30
   0--------1
   | \       |
   26| 25\ |15
   | \ |
   22--------23
   24 */
   int V = 24;
   int E = 25;
   struct Graph* graph = createGraph(V, E);
   graph->edge[0].src = 20;
   graph->edge[0].dest = 21;
   graph->edge[0].weight = 30;
   graph->edge[1].src = 20;
   graph->edge[1].dest = 22;
   graph->edge[1].weight = 26;
   graph->edge[2].src = 20;
   graph->edge[2].dest = 23;
   graph->edge[2].weight = 25;
   graph->edge[3].src = 21;
   graph->edge[3].dest = 23;
   graph->edge[3].weight = 35;
   graph->edge[4].src = 22;
   graph->edge[4].dest = 23;
   graph->edge[4].weight = 24;
   KruskalMST(graph);
   return 0;
}

आउटपुट

Following are the edges in the constructed MST
22 -- 23 == 24
20 -- 23 == 25
20 -- 21 == 30
Minimum Cost Spanning tree : 79

निष्कर्ष

इस ट्यूटोरियल ने दिखाया कि इस समस्या को हल करने के लिए क्रुस्कल की न्यूनतम स्पैनिंग ट्री एल्गोरिथम-लालची विधि और C++ कोड का उपयोग कैसे करें। हम इस कोड को जावा, पायथन और अन्य भाषाओं में भी लिख सकते हैं। यह क्रुस्कल की अवधारणा द्वारा तैयार किया गया था। यह प्रोग्राम किसी दिए गए ग्राफ़ में सबसे छोटा फैले हुए पेड़ को ढूंढता है। हमें उम्मीद है कि आपको यह ट्यूटोरियल मददगार लगा होगा।


  1. C++ में बाइनरी ट्री की न्यूनतम गहराई

    मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें उस वृक्ष की न्यूनतम गहराई ज्ञात करनी है। जैसा कि हम जानते हैं कि न्यूनतम गहराई रूट नोड से निकटतम लीफ नोड तक सबसे छोटे पथ के साथ नोड्स की संख्या है। तो, अगर इनपुट पसंद है तो आउटपुट 2 . होगा इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - ट्री नोड्स

  1. C++ में एक पूर्ण ग्राफ़ से अधिकतम संभव एज डिसजॉइंट स्पैनिंग ट्री

    मान लीजिए हमारे पास एक पूरा ग्राफ है; हमें एज डिसजॉइंट स्पैनिंग ट्री की संख्या गिननी है। एज डिसजॉइंट स्पैनिंग पेड़ फैले हुए पेड़ हैं, जहां सेट में कोई भी दो पेड़ आम तौर पर किनारे नहीं होते हैं। मान लीजिए कि N (शीर्षों की संख्या) 4 है, तो आउटपुट 2 होगा। 4 शीर्षों का उपयोग करने वाला पूरा ग्राफ नीचे जै

  1. डेटा संरचनाओं में न्यूनतम फैले हुए पेड़

    एक फैला हुआ पेड़ अप्रत्यक्ष ग्राफ़ का एक उपसमुच्चय है जिसमें सभी शीर्ष किनारों की न्यूनतम संख्या से जुड़े होते हैं। यदि सभी कोने एक ग्राफ में जुड़े हुए हैं, तो कम से कम एक फैले हुए पेड़ मौजूद हैं। ग्राफ़ में, एक से अधिक फैले हुए वृक्ष हो सकते हैं। न्यूनतम फैले हुए पेड़ एक न्यूनतम स्पैनिंग ट्री (MS