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

C++ में दिए गए निर्भरताओं से कार्यों का क्रम खोजें


मान लीजिए हमारे पास n अलग-अलग कार्य हैं; ये कार्य 0 से n-1 तक लेबल किए गए हैं। कुछ कार्यों में पूर्वापेक्षा कार्य हो सकते हैं, इसलिए उदाहरण के लिए यदि हम कार्य 2 चुनना चाहते हैं तो हमें पहले कार्य 1 पूरा करना होगा, जिसे एक युग्म के रूप में दर्शाया गया है: [2, 1]। यदि हमारे पास कार्यों की कुल संख्या और पूर्वापेक्षा युग्मों की सूची है, तो हमें सभी कार्यों को पूरा करने के लिए कार्यों का क्रम ढूंढना है। यदि एक से अधिक सही क्रम हैं, तो हम उनमें से कोई भी एक लौटा सकते हैं। और यदि दिए गए सभी कार्यों को पूरा करना असंभव है, तो एक खाली सरणी लौटाएं।

इसलिए, यदि इनपुट n = 4, और A = [[1, 0], [2, 0], [3, 2], [3, 1], [4, 2]] है, तो आउटपुट [0, 2, 1, 4, 3] होगा।

समाधान दृष्टिकोण

इसे हल करने के लिए हम निम्न चरणों का पालन करेंगे:

  • dfs() फ़ंक्शन परिभाषित करें, जो graph, start, onpath, visited सरणी, toposort सरणी लेता है।
  • यदि visited[start] चिह्नित है, तो false लौटाएं।
  • onpath[start] := true, visited[start] := true
  • graph[start] में प्रत्येक neighbor के लिए:
    • यदि onpath[neighbor] true है या dfs(graph, neighbor, onpath, visited, toposort) true है, तो true लौटाएं।
  • start को toposort के अंत में डालें।
  • onpath[start] := false लौटाएं।
  • मुख्य विधि से:
    • graph = create_graph(n, pre) (n शीर्ष और pre सरणी में संग्रहीत एज के साथ ग्राफ बनाएं)
    • toposort सरणी परिभाषित करें।
    • onpath सरणी आकार n false से भरें।
    • visited सरणी आकार n false से भरें।
    • i := 0 से n-1 तक:
      • यदि visited[i] false है और dfs(graph, i, onpath, visited, toposort) true है, तो खाली सरणी लौटाएं।
    • toposort सरणी को उल्टा करें।
    • toposort लौटाएं।

उदाहरण

बेहतर समझ के लिए निम्न कार्यान्वयन देखें:

#include 
using namespace std;

vector> create_graph(int n, vector>& pre) {
    vector> graph(n);
    for (auto p : pre)
        graph[p.second].insert(p.first);
    return graph;
}

bool dfs(vector>& graph, int start,
         vector& onpath, vector& visited, vector& toposort) {
    if (visited[start])
        return false;
    onpath[start] = visited[start] = true;
    for (int neigh : graph[start])
        if (onpath[neigh] || dfs(graph, neigh, onpath, visited, toposort))
            return true;
    toposort.push_back(start);
    return onpath[start] = false;
}

vector get_order(int n, vector>& pre) {
    vector> graph = create_graph(n, pre);
    vector toposort;
    vector onpath(n, false), visited(n, false);
    for (int i = 0; i < n; i++)
        if (!visited[i] && dfs(graph, i, onpath, visited, toposort))
            return {};
    reverse(toposort.begin(), toposort.end());
    return toposort;
}

int main() {
    int n = 4;
    vector> pre = {{1, 0}, {2, 0}, {3, 2}, {3, 1}, {4, 0}};
    vector v = get_order(n, pre);
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
}

इनपुट

4, {{1, 0}, {2, 0}, {3, 2}, {3, 1}, {4, 0}}

आउटपुट

0 1 4 2 3
  1. C++ का उपयोग करके दिए गए बिंदुओं से संभावित चतुर्भुजों की संख्या ज्ञात करें C++ का उपयोग करके दिए गए बिंदुओं से संभावित चतुर्भुजों की संख्या ज्ञात करें

    यूक्लिडियन प्लेन ज्यामिति में एक चतुर्भुज चार शीर्षों और चार किनारों के साथ एक बहुभुज बनाता है। नाम 4-gon आदि। चतुर्भुजों के अन्य नामों में शामिल हैं और कभी-कभी उन्हें वर्ग, डिस्प्ले स्टाइल आदि के रूप में भी जाना जाता है।इस लेख में, हम दिए गए बिंदुओं से संभावित चतुर्भुजों की संख्या ज्ञात करने के दृष

  1. C++ में दिए गए प्रारंभिक वर्ण से सबसे लंबे लगातार पथ की लंबाई ज्ञात करें C++ में दिए गए प्रारंभिक वर्ण से सबसे लंबे लगातार पथ की लंबाई ज्ञात करें

    विभिन्न वर्णों का एक मैट्रिक्स दिया गया है। एक वर्ण से शुरू करके हमें सबसे लंबा पथ ढूंढना है जो उन सभी वर्णों को पार करके जाता है जो वर्तमान वर्ण से बड़े हैं। वर्ण एक-दूसरे के क्रमागत हैं। E से शुरू होता है। सबसे लंबा पथ ढूंढने के लिए, हम डेप्थ फर्स्ट सर्च एल्गोरिदम का उपयोग करेंगे। DFS के दौरान, क

  1. - C++ प्रोग्राम: जांचें कि क्या दिए गए निर्भरताओं से सभी कार्यों को पूरा करना संभव है

    इस लेख में, हम एक प्रोग्राम पर चर्चा करेंगे जो दिए गए पूर्वापेक्षाओं के आधार पर सभी दिए गए कार्यों को पूरा करना संभव है या नहीं जांचता है। उदाहरण के लिए, मान लीजिए हमें तीन कार्य दिए गए हैं और पूर्वापेक्षाएं [[1, 0], [2, 1], [3, 2]] हैं। ([1,0] का अर्थ है कि 1 कार्य लेने के लिए; 0 कार्य पहले पूरा क