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

एकल-स्रोत सबसे छोटा पथ, गैर-ऋणात्मक भार

<घंटा/>

सिंगल सोर्स शॉर्टेस्ट पाथ एल्गोरिथम (गैर-नकारात्मक वजन के लिए) को दिज्क्स्ट्रा एल्गोरिथम भी कहा जाता है। इसके आसन्न मैट्रिक्स प्रतिनिधित्व के साथ एक दिया गया ग्राफ G(V,E) है, और एक स्रोत शीर्ष भी प्रदान किया गया है। ग्राफ़ जी के किसी अन्य शीर्ष से स्रोत शीर्ष के बीच न्यूनतम सबसे छोटा पथ खोजने के लिए डिजस्ट्रा का एल्गोरिदम।

एकल-स्रोत सबसे छोटा पथ, गैर-ऋणात्मक भार

नोड को प्रारंभ करने से किसी अन्य नोड तक, सबसे छोटी दूरी ज्ञात करें। इस समस्या में ग्राफ को आसन्न मैट्रिक्स का उपयोग करके दर्शाया जाता है। (लागत मैट्रिक्स और आसन्नता मैट्रिक्स इस उद्देश्य के लिए समान हैं)।

इनपुट - आसन्न मैट्रिक्स -

0 3 6 ∞ ∞ ∞ ∞
3 0 2 1 ∞ ∞ ∞
6 2 0 1 4 2 ∞
∞ 1 1 0 2 ∞ 4
∞ ∞ 4 2 0 2 1
∞ ∞ 2 ∞ 2 0 1
∞ ∞ ∞ 4 1 1 0

आउटपुट -

0 to 1, Using: 0, Cost: 3

0 to 2, Using: 1, Cost: 5

0 to 3, Using: 1, Cost: 4

0 to 4, Using: 3, Cost: 6

0 to 5, Using: 2, Cost: 7

0 to 6, Using: 4, Cost: 7

एल्गोरिदम

dijkstraShortestPath(n, dist, next, start)

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

आउटपुट − प्रारंभ से अन्य सभी शीर्षों तक का सबसे छोटा पथ।

Begin
   create a status list to hold the current status of the selected node
   for all vertices u in V do
      status[u] := unconsidered
      dist[u] := distance from source using cost matrix
      next[u] := start
   done
   status[start] := considered, dist[start] := 0 and next[start] := φ
   while take unconsidered vertex u as distance is minimum do
      status[u] := considered
      for all vertex v in V do
         if status[v] = unconsidered then
         if dist[v] > dist[u] + cost[u,v] then
            dist[v] := dist[u] + cost[u,v]
            next[v] := u
      done
   done
End

उदाहरण(C++)

#include<iostream>
#define V 7
#define INF 999
using namespace std;
//Cost matrix of the graph
int costMat[V][V] = {
   {0, 3, 6, INF, INF, INF, INF},
   {3, 0, 2, 1, INF, INF, INF},
   {6, 2, 0, 1, 4, 2, INF},
   {INF, 1, 1, 0, 2, INF, 4},
   {INF, INF, 4, 2, 0, 2, 1},
   {INF, INF, 2, INF, 2, 0, 1},
   {INF, INF, INF, 4, 1, 1, 0}
};
int minimum(int *status, int *dis, int n){
   int i, min, index;
   min = INF;
   for(i = 0; i<n; i++)
      if(dis[i] < min && status[i] == 1){
      min = dis[i];
      index = i;
   }
   if(status[index] == 1)
      return index;//minimum unconsidered vertex distance
   else
      return -1;//when all vertices considered
}
void dijkstra(int n, int *dist,int *next, int s){
   int status[V];
   int u, v;
   //initialization
   for(u = 0; u<n; u++){
      status[u] = 1;//unconsidered vertex
      dist[u] = costMat[u][s];//distance from source
      next[u] = s;
   }
   //for source vertex
   status[s] = 2; dist[s] = 0; next[s] = -1;//-1 for starting vertex
   while((u = minimum(status, dist, n)) > -1){
      status[u] = 2;//now considered
      for(v = 0; v<n; v++)
         if(status[v] == 1)
            if(dist[v] > dist[u] + costMat[u][v]){
      dist[v] = dist[u] + costMat[u][v];//update distance
      next[v] = u;
      }
   }
}
main(){
   int dis[V], next[V], i, start = 0;
   dijkstra(V, dis, next, start);
   for(i = 0; i<V; i++)
      if(i != start)
         cout << start << " to " << i <<", Using: " << next[i] << ", Cost: " << dis[i] << endl;
}

आउटपुट

0 to 1, Using: 0, Cost: 3

0 to 2, Using: 1, Cost: 5

0 to 3, Using: 1, Cost: 4

0 to 4, Using: 3, Cost: 6

0 to 5, Using: 2, Cost: 7

0 to 6, Using: 4, Cost: 7

  1. सभी जोड़े सबसे छोटे रास्ते

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

  1. डेटा संरचना में येन का k- सबसे छोटा पथ एल्गोरिथम

    एक सबसे छोटा रास्ता देने के बजाय, येन का k- सबसे छोटा पथ एल्गोरिथम k . देता है सबसे छोटा रास्ता ताकि हम दूसरा सबसे छोटा रास्ता और तीसरा सबसे छोटा रास्ता आदि प्राप्त कर सकें। आइए एक परिदृश्य पर विचार करें कि हमें स्थान A से स्थान B तक यात्रा करनी है और स्थान A और स्थान B के बीच कई मार्ग उपलब्ध हैं,

  1. सी ++ में एक बाइनरी ट्री में छद्म-पैलिंड्रोमिक पथ

    मान लीजिए कि हमारे पास एक बाइनरी ट्री है जहां नोड मान 1 से 9 तक के अंक हैं। बाइनरी ट्री में एक पथ को छद्म-पैलिंड्रोमिक कहा जाता है, जब पथ में नोड मानों का कम से कम एक क्रमपरिवर्तन एक पैलिंड्रोम होता है। हमें रूट नोड से लीफ नोड्स तक जाने वाले छद्म-पैलिंड्रोमिक पथों की संख्या ज्ञात करनी होगी। तो, अगर