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

एक निर्देशित चक्रीय ग्राफ में सबसे लंबा पथ


एक भारित निर्देशित चक्रीय ग्राफ दिया गया है। एक अन्य स्रोत शीर्ष भी प्रदान किया गया है। अब हमें ग्राफ में आरंभिक नोड से अन्य सभी शीर्षों तक की सबसे लंबी दूरी ज्ञात करनी है।

एक निर्देशित चक्रीय ग्राफ में सबसे लंबा पथ

एक निर्देशित चक्रीय ग्राफ में सबसे लंबा पथ

हमें टोपोलॉजिकल सॉर्टिंग तकनीक में नोड्स को सॉर्ट करने की आवश्यकता है, और टोपोलॉजिकल सॉर्ट को स्टैक में संग्रहीत करने के बाद परिणाम। उसके बाद बार-बार स्टैक से पॉप किया और प्रत्येक शीर्ष के लिए सबसे लंबी दूरी खोजने का प्रयास करें।

इनपुट और आउटपुट

Input:
The cost matrix of the graph.
0  5   3 -∞ -∞ -∞
-∞ 0   2  6 -∞ -∞
-∞ -∞  0  7  4  2
-∞ -∞ -∞  0 -1  1
-∞ -∞ -∞ -∞  0 -2
-∞ -∞ -∞ -∞ -∞  0

Output:
Longest Distance from Source Vertex 1
Infinity 0 2 9 8 10

एल्गोरिदम

topoSort(u, विज़िट किया गया, स्टैक)

इनपुट: नोड यू शुरू करना, ट्रैक रखने के लिए देखी गई सूची, स्टैक।

आउटपुट - नोड्स को टोपोलॉजिकल तरीके से क्रमबद्ध करें।

Begin
   mark u as visited
   for all vertex v, which is connected with u, do
      if v is not visited, then
         topoSort(v, visited, stack)
   done
   push u into the stack
End

सबसे लंबापथ(प्रारंभ)

इनपुट - प्रारंभिक नोड।

आउटपुट - आरंभिक नोड से सभी शीर्षों की सबसे लंबी दूरी की सूची।

Begin
   initially make all nodes as unvisited
   for each node i, in the graph, do
      if i is not visited, then
         topoSort(i, visited, stack)
   done

   make distance of all vertices as - ∞
   dist[start] := 0
   while stack is not empty, do
      pop stack item and take into nextVert
      if dist[nextVert] ≠ - ∞, then
         for each vertices v, which is adjacent with nextVert, do
            if cost[nextVert, v] ≠ - ∞, then
               if dist[v] < dist[nectVert] + cost[nextVert, v], then
                  dist[v] := dist[nectVert] + cost[nextVert, v]
         done
   done

   for all vertices i in the graph, do
      if dist[i] = - ∞, then
         display Infinity
      else
         display dist[i]
   done
End

उदाहरण

#include<iostream>
#include<stack>
#define NODE 6
#define INF -9999
using namespace std;

int cost[NODE][NODE] = {
   {0, 5, 3, INF, INF, INF},
   {INF, 0, 2, 6, INF, INF},
   {INF, INF, 0, 7, 4, 2},
   {INF, INF, INF, 0, -1, 1},
   {INF, INF, INF, INF, 0, -2},
   {INF, INF, INF, INF, INF, 0}
};

void topoSort(int u, bool visited[], stack<int>&stk) {
   visited[u] = true;    //set as the node v is visited

   for(int v = 0; v<NODE; v++) {
      if(cost[u][v]) {    //for allvertices v adjacent to u
         if(!visited[v])
            topoSort(v, visited, stk);
      }
   }

   stk.push(u);    //push starting vertex into the stack
}

void longestPath(int start) {
   stack<int> stk;
   int dist[NODE];
   bool vis[NODE];

   for(int i = 0; i<NODE;i++)
      vis[i] = false;    // make all nodes as unvisited at first
         
   for(int i = 0; i<NODE; i++)    //perform topological sort for vertices
      if(!vis[i])
         topoSort(i, vis, stk);
               
   for(int i = 0; i<NODE; i++)
      dist[i] = INF;    //initially all distances are infinity
   dist[start] = 0;    //distance for start vertex is 0
   
   while(!stk.empty()) {    //when stack contains element, process in topological order
      int nextVert = stk.top(); stk.pop();

      if(dist[nextVert] != INF) {
         for(int v = 0; v<NODE; v++) {
            if(cost[nextVert][v] && cost[nextVert][v] != INF) {
               if(dist[v] < dist[nextVert] + cost[nextVert][v])
                  dist[v] = dist[nextVert] + cost[nextVert][v];
            }
         }
      }
   }
     
   for(int i = 0; i<NODE; i++)
      (dist[i] == INF)?cout << "Infinity ":cout << dist[i]<<" ";
}

main() {
   int start = 1;
   cout << "Longest Distance From Source Vertex "<<start<<endl;
   longestPath(start);
}

आउटपुट

Longest Distance From Source Vertex 1
Infinity 0 2 9 8 10

  1. सी ++ प्रोग्राम यह जांचने के लिए कि क्या निर्देशित ग्राफ़ में एक यूलरियन पथ है

    यूलर पथ एक पथ है; जिससे हम हर किनारे पर ठीक एक बार जा सकते हैं। हम एक ही कोने को कई बार इस्तेमाल कर सकते हैं। इस मामले में यूलर सर्किट वाले एक ग्राफ पर भी विचार किया जाता है, क्योंकि इसमें यूलर पथ भी होता है। यह जांचने के लिए कि एक निर्देशित ग्राफ में यूलर पथ है या नहीं, हमें इन शर्तों की जांच करनी

  1. दिज्क्स्ट्रा का एल्गोरिथ्म एक ग्राफ के माध्यम से सबसे छोटे पथ की गणना करने के लिए

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

  1. पायथन में निर्देशित ग्राफ को उलटने का कार्यक्रम

    मान लीजिए कि हमारे पास एक निर्देशित ग्राफ है, हमें इसका उल्टा पता लगाना है, इसलिए यदि कोई किनारा u से v तक जाता है, तो यह अब v से u तक जाता है। यहां इनपुट एक आसन्न सूची होगी, और यदि n नोड्स हैं, तो नोड्स (0, 1, ..., n-1) होंगे। तो, अगर इनपुट पसंद है तो आउटपुट होगा इसे हल करने के लिए, हम इन चर