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

C++ में अनडायरेक्टेड ग्राफ में कनेक्टेड कंपोनेंट्स की संख्या


समस्या विवरण

मान लीजिए हमारे पास n नोड्स हैं जो 0 से n-1 तक लेबल किए गए हैं और अनडायरेक्टेड एज की एक सूची दी गई है, हमें अनडायरेक्टेड ग्राफ में कनेक्टेड कंपोनेंट्स की संख्या ढूंढने के लिए एक फ़ंक्शन परिभाषित करना है।

उदाहरण के लिए, यदि n = 5 और edges = [[0, 1], [1, 2], [3, 4]] है:

C++ में अनडायरेक्टेड ग्राफ में कनेक्टेड कंपोनेंट्स की संख्या

तो आउटपुट 2 होगा।

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

DFS का उपयोग करके कनेक्टेड कंपोनेंट्स गिनें:

  1. dfs() फ़ंक्शन परिभाषित करें जो नोड, ग्राफ, विज़िटेड सरणी लेता है:
    • यदि विज़िटेड[नोड] गलत है, तो विज़िटेड[नोड] := true
    • ग्राफ[नोड] के प्रत्येक पड़ोसी के लिए dfs() को पुनरावर्ती रूप से कॉल करें
  2. मुख्य विधि से:
    • आकार n की विज़िटेड सरणी परिभाषित करें
    • यदि n शून्य है, तो 0 लौटाएं
    • आकार n की ग्राफ सरणी परिभाषित करें
    • प्रत्येक एज के लिए u, v निकालें और दोनों दिशाओं में ग्राफ में जोड़ें
    • ret := 0
    • i को 0 से n-1 तक लूप करें:
      • यदि विज़िटेड[i] गलत है, तो dfs(i) कॉल करें और ret बढ़ाएं
    • ret लौटाएं

C++ कार्यान्वयन

#include <bits/stdc++.h> 
using namespace std; 

class Solution { 
public: 
    void dfs(int node, vector<int> graph[], vector<bool>& visited){ 
        if(visited[node]) return; 
        visited[node] = true; 
        for(int i = 0; i < graph[node].size(); i++){ 
            dfs(graph[node][i], graph, visited); 
        } 
    } 
    
    int countComponents(int n, vector<vector<int>>& edges) { 
        vector <bool> visited(n); 
        if(!n) return 0; 
        vector <int> graph[n]; 
        for(int i = 0; i < edges.size(); i++){ 
            int u = edges[i][0]; 
            int v = edges[i][1]; 
            graph[u].push_back(v); 
            graph[v].push_back(u); 
        } 
        int ret = 0; 
        for(int i = 0; i < n; i++){ 
            if(!visited[i]){ 
                dfs(i, graph, visited); 
                ret++; 
            } 
        } 
        return ret; 
    } 
}; 

int main(){ 
    Solution ob; 
    vector<vector<int>> v = {{0,1},{1,2},{3,4}}; 
    cout << (ob.countComponents(5, v)); 
    return 0;
}

इनपुट

5, [[0,1],[1,2],[3,4]]

आउटपुट

2
  1. C++ में अप्रत्यक्ष ग्राफ (Undirected Graph) में सभी चक्र (Cycles) प्रिंट करें C++ में अप्रत्यक्ष ग्राफ (Undirected Graph) में सभी चक्र (Cycles) प्रिंट करें

    इस समस्या में, हमें एक अप्रत्यक्ष ग्राफ दिया गया है और हमें ग्राफ में बने सभी चक्रों को प्रिंट करना है। अप्रत्यक्ष ग्राफ एक ग्राफ है जो एक साथ जुड़ा हुआ है। अप्रत्यक्ष ग्राफ के सभी किनारे द्विदिशात्मक हैं। इसे अप्रत्यक्ष नेटवर्क के रूप में भी जाना जाता है। चक्र ग्राफ डेटा संरचना में एक ग्राफ है जिसम

  1. C++ में अविकलित ग्राफ में सभी चक्रों की लंबाई का गुणनफल C++ में अविकलित ग्राफ में सभी चक्रों की लंबाई का गुणनफल

    हमें इनपुट के रूप में अविकलित और अवेटेड ग्राफ दिया गया है और कार्य दिए गए ग्राफ में बने चक्रों का गुणनफल खोजना और परिणाम प्रदर्शित करना है।उदाहरणइनपुटदिए गए आंकड़े में, 8 नोड्स हैं और उनमें से 5 नोड्स 1, 6, 3, 5, 8 सहित चक्र बना रहे हैं और बाकी नोड्स चक्र में शामिल नहीं हैं। तो, चक्र की लंबाई 5 है क

  1. C++ में ग्राफ दृढ़ता से जुड़ा (Strongly Connected) है या नहीं जांचें - कोसराजू एल्गोरिदम C++ में ग्राफ दृढ़ता से जुड़ा (Strongly Connected) है या नहीं जांचें - कोसराजू एल्गोरिदम

    दृढ़ता से जुड़ा ग्राफ एक निर्देशित ग्राफ दृढ़ता से जुड़ा है यदि किन्हीं दो शीर्षों के बीच दोनों दिशाओं में पथ मौजूद हो। कोसराजू एल्गोरिदम (DFS आधारित) सभी नोड्स को अनविजिटेड मार्क करें किसी भी शीर्ष से DFS करें। यदि सभी नोड्स विजिट नहीं हुए → false सभी एज उलट दें (ट्रांसपोज ग्राफ) फिर से सभी अनवि