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

Python में निर्देशित ग्राफ में सबसे बड़ा रंग मान ज्ञात करें

एक निर्देशित ग्राफ दिया गया है जिसमें n रंगीन नोड्स और m एज हैं। प्रत्येक नोड का एक रंग (लोअरकेस अक्षर) है। एक वैध पथ नोड्स का अनुक्रम है जहां प्रत्येक नोड से अगले में निर्देशित एज है। पथ का रंग उस पथ में सबसे अधिक बार आने वाला नोड रंग है। सबसे बड़े रंग मान वाले वैध पथ को खोजें। यदि ग्राफ में साइकिल है तो -1 लौटाएं।

एल्गोरिदम: टोपोलॉजिकल सॉर्ट + डायनामिक प्रोग्रामिंग

  1. इन-डिग्री (आने वाली एज) की गणना करें
  2. क्यू में इन-डिग्री 0 वाले नोड्स डालें
  3. dp[node][color]: उस नोड पर समाप्त होने वाले पथ में रंग की अधिकतम गिनती
  4. टोपोलॉजिकल क्रम में प्रोसेस करें, पड़ोसियों को अपडेट करें
  5. यदि सभी नोड्स विज़िट नहीं हुए → साइकिल मौजूद है → -1 लौटाएं
  6. अन्यथा dp में अधिकतम मान लौटाएं

Python कार्यान्वयन


from collections import defaultdict, deque

def largest_color_value(colors, edges):
    """
    colors: स्ट्रिंग, colors[i] = नोड i का रंग ('a'-'z')
    edges: सूची of (u, v) निर्देशित एज
    return: अधिकतम रंग मान या -1 (यदि साइकिल)
    """
    n = len(colors)
    graph = defaultdict(list)
    indegree = defaultdict(int)
    
    # ग्राफ और इन-डिग्री बनाएं
    for u, v in edges:
        graph[u].append(v)
        indegree[v] += 1
    
    # DP टेबल: n x 26 (प्रत्येक लोअरकेस अक्षर के लिए)
    dp = [[0] * 26 for _ in range(n)]
    color_vals = [ord(c) - ord('a') for c in colors]
    
    # क्यू इनिशियलाइज़ करें: इन-डिग्री 0 वाले नोड्स
    queue = deque()
    for u in range(n):
        if indegree[u] == 0:
            queue.append(u)
            dp[u][color_vals[u]] = 1
    
    visited = 0
    while queue:
        u = queue.popleft()
        visited += 1
        
        for v in graph[u]:
            # सभी 26 रंगों के लिए DP अपडेट
            for c in range(26):
                # यदि v का रंग c है तो 1 जोड़ें
                add = 1 if c == color_vals[v] else 0
                dp[v][c] = max(dp[v][c], dp[u][c] + add)
            
            indegree[v] -= 1
            if indegree[v] == 0:
                queue.append(v)
                del indegree[v]
    
    # साइकिल जांच
    if visited < n:
        return -1
    
    # अधिकतम रंग मान
    return max(max(row) for row in dp)

# परीक्षण
colors = "aabada"
edges = [(0,1), (1,4), (1,2), (2,3), (3,5), (4,5)]
print(largest_color_value(colors, edges))  # आउटपुट: 4

व्याख्या

पथ 0 → 1 → 2 → 3 → 5 में रंग 'a' चार बार आता है (नोड्स 0, 1, 2, 5), जो अधिकतम है।

जटिलता

  • समय: O(n × 26 + m × 26) = O(n + m) चूंकि 26 स्थिर है
  • स्थान: O(n × 26) = O(n)

मुख्य बिंदु

  • साइकिल डिटेक्शन: टोपोलॉजिकल सॉर्ट में सभी नोड्स प्रोसेस नहीं होते यदि साइकिल है
  • DP स्टेट: नोड × रंग = उस रंग की अधिकतम गिनती
  • रंगों को 0-25 इंडेक्स में मैप करें (ord(c) - ord('a'))
  • deque O(1) पॉपलेफ्ट के लिए
  1. पायथन में निर्देशित ग्राफ को उलटने का प्रोग्राम पायथन में निर्देशित ग्राफ को उलटने का प्रोग्राम

    मान लीजिए हमारे पास एक निर्देशित ग्राफ है, हमें इसका उल्टा ढूंढना है ताकि यदि एक किनारा u से v तक जाता है, तो अब यह v से u तक जाए। यहां इनपुट एक एडजेंसी सूची होगी, और यदि n नोड्स हैं, तो नोड्स (0, 1, ..., n-1) होंगे।इसलिए, यदि इनपुट इस तरह हैतो आउटपुट होगाइसे हल करने के लिए, हम इन चरणों का पालन करें

  1. Python प्रोग्राम से ऐरे में सबसे बड़ा तत्व खोजना Python प्रोग्राम से ऐरे में सबसे बड़ा तत्व खोजना

    इस लेख में, हम नीचे दिए गए समस्या कथन के समाधान के बारे में जानेंगे। समस्या कथन - हमें एक ऐरे दिया गया है, हमें ऐरे के सबसे बड़े तत्व की गणना करने की आवश्यकता है। यहां हम ब्रूट-फोर्स दृष्टिकोण का उपयोग करते हैं जिसमें हम पूरे लूप को पार करके और तत्व प्राप्त करके सबसे बड़ा तत्व निकालते हैं। हम नीच

  1. पायथन प्रोग्राम: ऐरे में सबसे बड़ा एलिमेंट ढूंढें पायथन प्रोग्राम: ऐरे में सबसे बड़ा एलिमेंट ढूंढें

    इस लेख में, हम दिए गए प्रॉब्लम स्टेटमेंट को हल करने के समाधान और दृष्टिकोण के बारे में सीखेंगे। प्रॉब्लम स्टेटमेंट इनपुट के रूप में एक ऐरे दिए जाने पर, हमें ऐरे में सबसे बड़ा एलिमेंट ढूंढने की आवश्यकता है। दृष्टिकोण हम max को पहले एलिमेंट के रूप में इनिशियलाइज़ करते हैं। इसके बाद, हम दिए गए ऐरे