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

0-1 BFS (बाइनरी वेट ग्राफ में सबसे छोटा पथ) C प्रोग्राम में?


मान लीजिए हमारे पास कुछ नोड्स और कनेक्टेड एज वाला एक ग्राफ है। प्रत्येक एज का बाइनरी वेट है। इसलिए वेट या तो 0 या 1 होगा। एक सोर्स वर्टेक्स दिया गया है। हमें सोर्स से किसी भी अन्य वर्टेक्स तक सबसे छोटा पथ ढूंढना है। मान लीजिए ग्राफ नीचे जैसा है:

0-1 BFS (बाइनरी वेट ग्राफ में सबसे छोटा पथ) C प्रोग्राम में?

सामान्य BFS एल्गोरिदम में सभी एज वेट समान होते हैं। यहां कुछ 0 हैं और कुछ 1। प्रत्येक चरण में हम इष्टतम दूरी की स्थिति की जांच करेंगे। यहां हम नोड को स्टोर करने के लिए डबल एंडेड क्यू (deque) का उपयोग करेंगे। इसलिए हम एज वेट की जांच करेंगे। यदि यह 0 है, तो इसे फ्रंट पर पुश करें, अन्यथा बैक पर। आइए बेहतर विचार के लिए एल्गोरिदम देखें।

एल्गोरिदम

binaryBFS(src) -

begin
    define dist array to store source to vertex i into dist[i]. Initially fill with infinity
    dist[src] := 0
    insert src into queue Q.
    v := first element from Q, and delete it from queue
    while Q is not empty, do
        for all connected edge e of v, do
            if the weight of v to next of i > dist[v] + weight of v to i weight, then update the weight
                if the weight is 0, then store to front, otherwise back
            end if
        done
    done
    print all distance from dist array
end

उदाहरण

#include<iostream>
#include<vector>
#include<deque>
#define V 8
using namespace std;
struct node {
    int next, weight;
};
vector  edges[V];
void binaryBFS(int src) {
    int dist[V];
    for (int i=0; i Q;
    dist[src] = 0; // सोर्स से सोर्स की दूरी 0 है
    Q.push_back(src);
    while (!Q.empty()) {
        int v = Q.front(); // पहला वर्टेक्स डिलीट करें, और v में स्टोर करें
        Q.pop_front();
        for (int i=0; i dist[v] + edges[v][i].weight) {
                dist[edges[v][i].next] = dist[v] + edges[v][i].weight;
                if (edges[v][i].weight == 0) // 0 वेट एज को फ्रंट पर स्टोर करें, अन्यथा बैक पर
                    Q.push_front(edges[v][i].next);
                else
                    Q.push_back(edges[v][i].next);
            }
        }
    }
    for (int i=0; i

आउटपुट

1 1 1 1 1 2 0 1

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

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

  1. ठीक k किनारों के साथ सबसे छोटा पथ ठीक k किनारों के साथ सबसे छोटा पथ

    एक निर्देशित ग्राफ प्रत्येक शीर्ष जोड़े के बीच भार के साथ प्रदान किया जाता है, और दो शीर्ष u और v भी प्रदान किए जाते हैं। हमारा कार्य शीर्ष u से शीर्ष v तक की सबसे छोटी दूरी ढूंढना है, ठीक k संख्या के किनारों के साथ। इस समस्या को हल करने के लिए, हम शीर्ष u से शुरू करेंगे और सभी आसन्न शीर्षों पर जा

  1. C++ में डिस्कनेक्टेड ग्राफ के लिए BFS C++ में डिस्कनेक्टेड ग्राफ के लिए BFS

    डिस्कनेक्टेड ग्राफ एक ग्राफ है जिसमें एक या अधिक नोड्स ग्राफ के एंडपॉइंट्स नहीं होते यानी वे कनेक्टेड नहीं होते। एक डिस्कनेक्टेड ग्राफ... अब, सिंपल BFS केवल तब लागू होता है जब ग्राफ कनेक्टेड हो यानी ग्राफ के सभी वर्टेक्स ग्राफ के एक नोड से एक्सेसिबल हों। उपरोक्त डिस्कनेक्टेड ग्राफ में तकनीक संभव नह