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

सी ++ में यूलरियन पथ या सर्किट को प्रिंट करने के लिए फ्लेरी का एल्गोरिदम

फ्लेरी के एल्गोरिथम का उपयोग दिए गए ग्राफ से यूलर पथ या यूलर सर्किट को प्रदर्शित करने के लिए किया जाता है। इस एल्गोरिथ्म में, एक किनारे से शुरू होकर, यह पिछले कोने को हटाकर अन्य आसन्न कोने को स्थानांतरित करने का प्रयास करता है। इस ट्रिक का उपयोग करके, यूलर पथ या सर्किट को खोजने के लिए प्रत्येक चरण में ग्राफ सरल हो जाता है।

सी ++ में यूलरियन पथ या सर्किट को प्रिंट करने के लिए फ्लेरी का एल्गोरिदम

पथ या परिपथ प्राप्त करने के लिए हमें कुछ नियमों की जाँच करनी होगी -

  • ग्राफ़ एक यूलर ग्राफ़ होना चाहिए।
  • जब दो किनारे हों, एक ब्रिज हो, दूसरा नॉन-ब्रिज हो, हमें पहले नॉन-ब्रिज चुनना होगा।

प्रारंभिक शीर्ष का चयन करना भी मुश्किल है, हम किसी भी शीर्ष को प्रारंभिक शीर्ष के रूप में उपयोग नहीं कर सकते हैं, यदि ग्राफ़ में कोई विषम डिग्री शिखर नहीं है, तो हम किसी भी शीर्ष को प्रारंभ बिंदु के रूप में चुन सकते हैं, अन्यथा जब एक शीर्ष में विषम डिग्री होती है, तो हमें पहले उसे चुनना होगा ।

इनपुट − ग्राफ का एडजेंसी मैट्रिक्स

0 1 1 1 1
1 0 1 1 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 0

आउटपुट - यूलर पथ या सर्किट:1--0 0--2 2--1 1--3 3--0 0--4 4--3 3-2

एल्गोरिदम

findStartVert(graph)
Input: The given graph.
Output: Find the starting vertex to start algorithm.
Begin
   for all vertex i, in the graph, do
      deg := 0
      for all vertex j, which are adjacent with i, do
         deg := deg + 1
      done
      if deg is odd, then
         return i
      done
      when all degree is even return 0
End
isBridge(u, v)
Input: The start and end node.
Output: True when u and v are forming a bridge.
Begin
   deg := 0
   for all vertex i which are adjacent with v, do
      deg := deg + 1
   done
   if deg > 1, then
      return false
   return true
End
fleuryAlgorithm(start)
Input: The starting vertex.
Output: Display the Euler path or circuit.
Begin
   edge := get the number of edges in the graph //it will not initialize in next
   recursion call
   for all vertex v, which are adjacent with start, do
      if edge <= 1 OR isBridge(start, v) is false, then
         display path from start and v
         remove edge (start,v) from the graph
         decrease edge by 1
         fleuryAlgorithm(v)
   done
End

उदाहरण

#include<iostream>
#include<vector>
#define NODE 5
using namespace std;
int graph[NODE][NODE] = {{0, 1, 1, 1, 1},
   {1, 0, 1, 1, 0},
   {1, 1, 0, 1, 0},
   {1, 1, 1, 0, 1},
   {1, 0, 0, 1, 0}
};
int tempGraph[NODE][NODE];
int findStartVert(){
   for(int i = 0; i<NODE; i++){
      int deg = 0;
      for(int j = 0; j<NODE; j++){
         if(tempGraph[i][j])
         deg++; //increase degree, when connected edge found
      }
      if(deg % 2 != 0) //when degree of vertices are odd
      return i; //i is node with odd degree
   }
   return 0; //when all vertices have even degree, start from 0
}
bool isBridge(int u, int v){
   int deg = 0;
   for(int i = 0; i<NODE; i++)
      if(tempGraph[v][i])
         deg++;
      if(deg>1){
         return false; //the edge is not forming bridge
      }
   return true; //edge forming a bridge
}
int edgeCount(){
   int count = 0;
   for(int i = 0; i<NODE; i++)
      for(int j = i; j<NODE; j++)
         if(tempGraph[i][j])
            count++;
   return count; //count nunber of edges in the graph
}
void fleuryAlgorithm(int start){
   static int edge = edgeCount();
   for(int v = 0; v<NODE; v++){
      if(tempGraph[start][v]){ //when (u,v) edge is presnt and not forming bridge
         if(edge <= 1 || !isBridge(start, v)){
            cout << start << "--" << v << " ";
            tempGraph[start][v] = tempGraph[v][start] = 0; //remove edge from graph
            edge--; //reduce edge
            fleuryAlgorithm(v);
         }
      }
   }
}
int main(){
   for(int i = 0; i<NODE; i++) //copy main graph to tempGraph
   for(int j = 0; j<NODE; j++)
   tempGraph[i][j] = graph[i][j];
   cout << "Euler Path Or Circuit: ";
   fleuryAlgorithm(findStartVert());
}

आउटपुट

Euler Path Or Circuit: 1--0 0--2 2--1 1--3 3--0 0--4 4--3 3—2

  1. सी ++ में अहस्ताक्षरित पूर्णांक के लिए डिवीजन एल्गोरिदम बहाल करना

    एक विभाजन एल्गोरिथ्म का उपयोग करके एक अहस्ताक्षरित पूर्णांक को विभाजित करने पर चर्चा करें। कुछ डिवीजन एल्गोरिदम कागज पर लागू होते हैं, और अन्य डिजिटल सर्किट पर लागू होते हैं। डिवीजन एल्गोरिदम दो प्रकार के होते हैं:स्लो डिवीजन एल्गोरिथम और फास्ट डिवीजन एल्गोरिथम। स्लो डिविजन एल्गोरिथम में रिस्टोरिंग,

  1. मेमोरी प्रबंधन में सर्वश्रेष्ठ फ़िट एल्गोरिथम के लिए C++ प्रोग्राम

    ब्लॉक आकार और प्रक्रिया आकार वाले दो सरणियों को देखते हुए; कार्य स्मृति प्रबंधन में सर्वश्रेष्ठ फ़िट एल्गोरिथम के अनुसार परिणामों को प्रिंट करना है। सर्वश्रेष्ठ फ़िट एल्गोरिथम क्या है? बेस्ट फिट एक मेमोरी मैनेजमेंट एल्गोरिथम है; यह सबसे छोटा मुक्त विभाजन आवंटित करने से संबंधित है जो अनुरोध करने क

  1. इष्टतम पृष्ठ प्रतिस्थापन एल्गोरिथम के लिए C++ प्रोग्राम

    पृष्ठ संख्या और पृष्ठ आकार दिया गया; कार्य हिट और मिस की संख्या का पता लगाना है जब हम इष्टतम पेज रिप्लेसमेंट एल्गोरिथम का उपयोग करके किसी पृष्ठ को मेमोरी ब्लॉक आवंटित करते हैं। इष्टतम पृष्ठ प्रतिस्थापन एल्गोरिथम क्या है? इष्टतम पृष्ठ प्रतिस्थापन एल्गोरिथ्म एक पृष्ठ प्रतिस्थापन एल्गोरिथ्म है। पेज