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