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

सी ++ प्रोग्राम एक ग्राफ के ट्रांजिटिव क्लोजर का पता लगाने के लिए

यदि एक निर्देशित ग्राफ दिया गया है, तो निर्धारित करें कि दिए गए ग्राफ में सभी शीर्ष जोड़े (i, j) के लिए एक शीर्ष j दूसरे शीर्ष i से पहुंच योग्य है या नहीं। रीचेबल का मतलब है कि शीर्ष i से j तक का रास्ता है। इस रीचैबिलिटी मैट्रिक्स को ग्राफ़ का ट्रांजिटिव क्लोजर कहा जाता है। Warshall एल्गोरिथम आमतौर पर किसी दिए गए ग्राफ़ G के ट्रांजिटिव क्लोजर को खोजने के लिए उपयोग किया जाता है। इस एल्गोरिथम को लागू करने के लिए यहां एक C++ प्रोग्राम है।

एल्गोरिदम

Begin
   1. Take maximum number of nodes as input.
   2. For Label the nodes as a, b, c…..
   3. To check if there any edge present between the nodes
   make a for loop:
   // ASCII code of a is 97
   for i = 97 to (97 + n_nodes)-1
      for j = 97 to (97 + n_nodes)-1
         If edge is present do,
            adj[i - 97][j - 97] = 1
         else
            adj[i - 97][j - 97] = 0
      End loop
   End loop.
   4. To print the transitive closure of graph:
   for i = 0 to n_nodes-1
      c = 97 + i
   End loop.
   for i = 0 to n_nodes-1
      c = 97 + i
      for j = 0 to n_nodes-1
         Print adj[I][j]
      End loop
   End loop
End

उदाहरण

#include<iostream>
using namespace std;
const int n_nodes = 20;
int main()
{
   int n_nodes, k, n;
   char i, j, res, c;
   int adj[10][10], path[10][10];
   cout << "\n\tMaximum number of nodes in the graph :";
   cin >> n;
   n_nodes = n;
   cout << "\nEnter 'y' for 'YES' and 'n' for 'NO' \n";
   for (i = 97; i < 97 + n_nodes; i++)
      for (j = 97; j < 97 + n_nodes; j++)
   {
      cout << "\n\tIs there an edge from " << i << " to "
      << j << " ? ";
      cin >> res;
      if (res == 'y')
         adj[i - 97][j - 97] = 1;
      else
         adj[i - 97][j - 97] = 0;
   }
   cout << "\n\nTransitive Closure of the Graph:\n";
   cout << "\n\t\t\t ";
   for (i = 0; i < n_nodes; i++)
   {
      c = 97 + i;
      cout << c << " ";
   }
   cout << "\n\n";
   for (int i = 0; i < n_nodes; i++)
   {
      c = 97 + i;
      cout << "\t\t\t" << c << " ";
      for (int j = 0; j < n_nodes; j++)
      cout << adj[i][j] << " ";
      cout << "\n";
   }
   return 0;
}

आउटपुट

Maximum number of nodes in the graph :4
Enter 'y' for 'YES' and 'n' for 'NO'
Is there an edge from a to a ? y
Is there an edge from a to b ?y
Is there an edge from a to c ? n
Is there an edge from a to d ? n
Is there an edge from b to a ? y
Is there an edge from b to b ? n
Is there an edge from b to c ? y
Is there an edge from b to d ? n
Is there an edge from c to a ? y
Is there an edge from c to b ? n
Is there an edge from c to c ? n
Is there an edge from c to d ? n
Is there an edge from d to a ? y
Is there an edge from d to b ? n
Is there an edge from d to c ? y
Is there an edge from d to d ? n
Transitive Closure of the Graph:
a b c d
a 1 1 0 0
b 1 0 1 0
c 1 0 0 0
d 1 0 1 0

  1. ग्राफ़ का सकर्मक समापन

    संक्रमणीय क्लोजर इसे एक ग्राफ के वर्टेक्स यू से वर्टेक्स वी तक पहुंचने के लिए रीचैबिलिटी मैट्रिक्स है। एक ग्राफ दिया गया है, हमें एक शीर्ष v खोजना है जो सभी शीर्ष युग्मों (u, v) के लिए दूसरे शीर्ष u से पहुंचा जा सकता है। अंतिम मैट्रिक्स बूलियन प्रकार है। जब वर्टेक्स u से वर्टेक्स v के लिए मान

  1. C++ प्रोग्राम ग्राफ में सुपर वर्टिस का पता लगाने के लिए

    मान लीजिए, हमें एक ग्राफ दिया गया है जिसमें n शीर्ष हैं। कोने 1 से n तक गिने जाते हैं, और वे सरणी किनारों में दिए गए किनारों से जुड़े होते हैं। प्रत्येक शीर्ष का 1 से n तक की संख्या के भीतर x मान होता है जो कि सरणी मान में दिया जाता है। अब, हमें ग्राफ से अति शीर्षों का पता लगाना है। एक शीर्ष i को सु

  1. सी ++ प्रोग्राम जीसीडी खोजने के लिए

    दो संख्याओं का सबसे बड़ा सामान्य भाजक (GCD) उन दोनों को विभाजित करने वाली सबसे बड़ी संख्या है। उदाहरण के लिए:मान लें कि हमारे पास 45 और 27 दो संख्याएँ हैं। 45 = 5 * 3 * 3 27 = 3 * 3 * 3 तो, 45 और 27 का GCD 9 है। दो संख्याओं का GCD ज्ञात करने का कार्यक्रम इस प्रकार दिया गया है। उदाहरण #include <