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

प्राइम (न्यूनतम स्पैनिंग ट्री) एमएसटी एल्गोरिथम

<घंटा/>

एक जुड़ा हुआ ग्राफ G(V,E) है और प्रत्येक किनारे के लिए वजन या लागत दी गई है। प्राइम का एल्गोरिदम ग्राफ जी से न्यूनतम फैले हुए पेड़ को ढूंढेगा।

यह वृक्ष दृष्टिकोण बढ़ रहा है। इस एल्गोरिदम को पेड़ शुरू करने के लिए बीज मूल्य की आवश्यकता है। बीज के शीर्ष को पूरा पेड़ बनाने के लिए उगाया जाता है।

प्राइम (न्यूनतम स्पैनिंग ट्री) एमएसटी एल्गोरिथम

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

  • इस समस्या की समय जटिलता O(V2) है। यहाँ V शीर्षों की संख्या है।

इनपुट -आसन्नता सूची -


प्राइम (न्यूनतम स्पैनिंग ट्री) एमएसटी एल्गोरिथम

आउटपुट -

(0)---(1|1) (0)---(2|3) (0)---(3|4)
(1)---(0|1) (1)---(4|2)
(2)---(0|3)
(3)---(0|4)
(4)---(1|2) (4)---(5|2)
(5)---(4|2) (5)---(6|3)
(6)---(5|3)

एल्गोरिदम

prims(g:Graph, t:tree, start)

इनपुट - ग्राफ़ g, एक खाली पेड़ और बीज का शीर्ष नाम 'स्टार्ट' आउटपुट:किनारों को जोड़ने के बाद का पेड़।

Begin
   define two sets as usedVert, unusedVert
   usedVert[0] := start and unusedVert[0] := φ
   for all vertices except start do
      usedVert[i] := φ
      unusedVert[i] := i //add all vertices in unused list
   done
   while number of vertices in usedVert ≠ V do //V is number of total nodes
      min := ∞
      for all vertices of usedVert array do
         for all vertices of the graph do
            if min > cost[i,j] AND i ≠ j then
               min := cost[i,j]
               ed := edge between i and j, and cost of ed := min
            done
         done
         unusedVert[destination of ed] := φ
         add edge ed into the tree t
         add source of ed into usedVert
   done
End

उदाहरण(C++)

#include<iostream>
#define V 7
#define INF 999
using namespace std;
//Cost matrix of the graph
int costMat[V][V] = {
   {0, 1, 3, 4, INF, 5, INF},
   {1, 0, INF, 7, 2, INF, INF},
   {3, INF, 0, INF, 8, INF, INF},
   {4, 7, INF, 0, INF, INF, INF},
   {INF, 2, 8, INF, 0, 2, 4},
   {5, INF, INF, INF, 2, 0, 3},
   {INF, INF, INF, INF, 4, 3, 0}
};
typedef struct{
   int u, v, cost;
}edge;
class Tree{
   int n;
   edge edges[V-1]; //as a tree has vertex-1 edges
   public:
   Tree(){
      n = 0;
   }
   void addEdge(edge e){
      edges[n] = e; //add edge e into the tree
      n++;
   }
   void printEdges(){ //print edge, cost and total cost
      int tCost = 0;
      for(int i = 0; i<n; i++){
         cout << "Edge: " << char(edges[i].u+'A') < "--" << char(edges[i].v+'A');
         cout << " And Cost: " << edges[i].cost << endl;
         tCost += edges[i].cost;
      }
      cout << "Total Cost: " << tCost << endl;
   }
   friend void prims(Tree &tre, int start);
};
void prims(Tree &tr, int start){
   int usedVert[V], unusedVert[V];
   int i, j, min, p;
   edge ed;
   //initialize
   usedVert[0] = start; p = 1;
   unusedVert[0] = -1;//-1 indicates the place is empty
   for(i = 1; i<V; i++){
      usedVert[i] = -1;//all places except first is empty
      unusedVert[i] = i;//fill with vertices
   }
   tr.n = 0;
   //get edges and add to tree
   while(p != V){ //p is number of vertices in usedVert array
      min = INF;
      for(i = 0; i<p; i++){
         for(j = 0; j<V; j++){
            if(unusedVert[j] != -1){
               if(min > costMat[i][j] && costMat[i][j] != 0){
                  //find the edge with minimum cost
                  //such that u is considered and v is not considered yet
                  min = costMat[i][j];
                  ed.u = i; ed.v = j; ed.cost = min;
               }
            }
         }
      }
      unusedVert[ed.v] = -1;//delete v from unusedVertex
      tr.addEdge(ed);
      usedVert[p] = ed.u; p++;//add u to usedVertex
   }
}
main(){
   Tree tr;
   prims(tr, 0); //starting node 0
   tr.printEdges();
}

आउटपुट

(0)---(1|1) (0)---(2|3) (0)---(3|4)
(1)---(0|1) (1)---(4|2)
(2)---(0|3)
(3)---(0|4)
(4)---(1|2) (4)---(5|2)
(5)---(4|2) (5)---(6|3)
(6)---(5|3)

  1. एम-आर्य वृक्ष

    कंप्यूटर विज्ञान में एक एम-आर्य पेड़ को नोड्स के संग्रह के रूप में परिभाषित किया जाता है जिसे सामान्य रूप से निम्न तरीके से पदानुक्रम में दर्शाया जाता है। पेड़ रूट नोड पर शुरू होता है। पेड़ का प्रत्येक नोड अपने चाइल्ड नोड्स के लिए पॉइंटर्स की एक सूची रखता है। चाइल्ड नोड्स की संख्या मी से कम या उसके

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

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

  1. पायथन में प्राइम एल्गोरिथ्म का उपयोग करके एमएसटी का पता लगाने का कार्यक्रम

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