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

C++ प्रोग्राम: DAG (डायरेक्टेड एसाइक्लिक ग्राफ) में SSSP (सिंगल सोर्स शॉर्टेस्ट पाथ) खोजें


यह डायरेक्टेड एसाइक्लिक ग्राफ (DAG) में SSSP (सिंगल सोर्स शॉर्टेस्ट पाथ) खोजने के लिए डिज्क्स्ट्रा एल्गोरिदम का उपयोग करने वाला C++ प्रोग्राम है, जो ग्राफ में पहले नोड से हर दूसरे नोड तक सबसे छोटे पाथ की लंबाई को प्रत्येक वर्टेक्स जोड़ी के साथ दिखाता है।

एल्गोरिदम

Begin    ग्राफ के तत्वों को इनपुट के रूप में लें।    function shortestpath():    वेरिएबल इनिशियलाइज़ करें    a[i] = 1    d[i] = 0    s[i].from = 0    i = 0 से 3 तक लूप इनिशियलाइज़ करें       यदि b[0][i] == 0          continue       अन्यथा          d[i] = b[0][i]          s[i].from = 0       done    done    व्हाइल लूप इनिशियलाइज़ करें जब तक (c < 4)    min = INFINITY इनिशियलाइज़ करें    i = 0 से 3 तक       यदि min <= d[i] या d[i] == 0 या a[i] == 1          continue       अन्यथा यदि min > d[i]          min = d[i]    done    क = 0 से 3 तक फॉर लूप       यदि (min == d[k])          t = k          break       अन्यथा          continue       done       a[t] = 1 इनिशियलाइज़ करें       j = 0 से 3 तक          यदि a[j] == 1 या b[t][j] == 0             continue          अन्यथा यदि a[j] != 1             यदि d[j] > (d[t] + b[t][j])                d[j] = d[t] + b[t][j]                s[i].from = t       done       c इन्क्रीमेंट करें    done    i = 0 से 3 तक फॉर लूप       नोड1 से नोड2 तक न्यूनतम लागत प्रिंट करें।    done End

उदाहरण

#include <iostream> using namespace std; #define INFINITY 9999 struct node {    int from; } s[4]; int c = 0; void djikstras(int *a, int b[][4], int *d) {    int i = 0, j, min, t;    a[i] = 1;    d[i] = 0;    s[i].from = 0;    for (i = 0; i < 4;i++) {       if (b[0][i] == 0) {          continue;       } else {          d[i] = b[0][i];          s[i].from = 0;       }    }    while (c < 4) {       min = INFINITY;       for (i = 0; i < 4; i++) {          if (min <= d[i] || d[i] == 0 || a[i] == 1) {             continue;          } else if (min > d[i]) {             min = d[i];          }       }       for (int k = 0; k < 4; k++) {          if (min == d[k]) {             t = k;             break;          } else {             continue;          }       }       a[t] = 1;       for (j = 0; j < 4; j++) {          if (a[j] == 1 || b[t][j] == 0) {             continue;          } else if (a[j] != 1) {             if (d[j] > (d[t] + b[t][j])) {                d[j] = d[t] + b[t][j];                s[i].from = t;             }          }       }       c++;    }    for (int i = 0; i < 4; i++) {       cout<<"from node "<<s[i].from<<" cost is:"<<d[i]<<endl;    } } int main() {    int a[4];    int d[4];    for(int k = 0; k < 4; k++) {       d[k] = INFINITY;    }    for (int i = 0; i < 4; i++) {       a[i] = 0;    }    int b[4][4];    for (int i = 0;i < 4;i++) {       cout<<"enter values for "<<(i+1)<<" row"<<endl;       for(int j = 0;j < 4;j++) {          cin>>b[i][j];       }    }    djikstras(a,b,d); }

आउटपुट

enter values for 1 row 0 1 3 2 enter values for 2 row 2 1 3 0 enter values for 3 row 2 3 0 1 enter values for 4 row 1 3 2 0 from node 0 cost is:0 from node 0 cost is:1 from node 0 cost is:3 from node 0 cost is:2

  1. निर्देशित चक्ररहित ग्राफ में सबसे छोटा पथ निर्देशित चक्ररहित ग्राफ में सबसे छोटा पथ

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

  1. C++ में स्रोत से k लंबाई से अधिक का पथ मौजूद है या नहीं खोजें C++ में स्रोत से k लंबाई से अधिक का पथ मौजूद है या नहीं खोजें

    अवधारणाएक दिए गए ग्राफ के संबंध में, ग्राफ में एक स्रोत शीर्ष और एक संख्या k (यहां k स्रोत शीर्ष और गंतव्य शीर्ष के बीच ग्राफ के पथ की लंबाई को इंगित करता है), हमारा कार्य यह निर्धारित करना है कि क्या दिया गया स्रोत से शुरू होकर किसी अन्य शीर्ष (यानी गंतव्य) पर समाप्त होने वाला एक सरल पथ (बिना किसी

  1. C++ प्रोग्राम: जांचें कि निर्देशित ग्राफ (Directed Graph) में यूलरियन पथ है या नहीं C++ प्रोग्राम: जांचें कि निर्देशित ग्राफ (Directed Graph) में यूलरियन पथ है या नहीं

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