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

C++ प्रोग्राम ग्राफ में सुपर वर्टिस का पता लगाने के लिए

मान लीजिए, हमें एक ग्राफ दिया गया है जिसमें n शीर्ष हैं। कोने 1 से n तक गिने जाते हैं, और वे सरणी 'किनारों' में दिए गए किनारों से जुड़े होते हैं। प्रत्येक शीर्ष का 1 से n तक की संख्या के भीतर 'x' मान होता है जो कि सरणी 'मान' में दिया जाता है। अब, हमें ग्राफ से अति शीर्षों का पता लगाना है। एक शीर्ष i को 'सुपर वर्टेक्स' कहा जाता है, जब शीर्ष 1 से i तक के सबसे छोटे पथ में i-वें शीर्ष के समान 'x' मान वाला शीर्ष नहीं होता है। हम इस मानदंड को पूरा करने वाले सभी शीर्षों का प्रिंट आउट लेते हैं।

C++ प्रोग्राम ग्राफ में सुपर वर्टिस का पता लगाने के लिए

इसलिए, यदि इनपुट n =5, मान ={1, 2, 2, 1, 3}, किनारों ={{1, 2}, {2, 3}, {2, 3}, {2, 4 }, {4, 5}}, तो आउटपुट 1 3 4 5 होगा।

शीर्ष 2 को छोड़कर प्रत्येक शीर्ष कसौटी को पूरा करता है। तो, शीर्ष 2 को बाहर रखा गया है।

कदम

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

Define arrays vertexVal, frq, and chk of size: 100005.
Define an array vcti of size 200005.
Define a function dfs(), this will take j, k,
   if frq[vertexVal[j]] is same as 0, then:
      chk[j] := 1
   (increase frq[vertexVal[j]] by 1)
   for each value a in vcti[j], do:
      if a is not equal to k, then:
         dfs(a, j)
   (decrease frq[vertexVal[j]] by 1)
for initialize i := 0, when i < n, update (increase i by 1), do:
   vertexVal[i] := values[i]
for initialize i := 0, when i < n, update (increase i by 1), do:
a := first value of edges[i]
b := second value of edges[i]
insert b at the end of vcti[a]
insert a at the end of vcti[b]
dfs(1, 0)
for initialize i := 1, when i <= n, update (increase i by 1), do:
if chk[i] is non-zero, then:
print(i)

उदाहरण

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

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

int n;
int vertexVal[100005], frq[100005], chk[100005];
vector<int> vcti[200005];

void dfs(int j, int k){
   if (frq[vertexVal[j]] == 0)
      chk[j] = 1;
   frq[vertexVal[j]]++;
   for (auto a : vcti[j]) {
      if (a != k)
         dfs(a, j);
   }
   frq[vertexVal[j]]--;
}
void solve(int values[], vector<pair<int, int>> edges){
   for (int i = 0; i < n; i++)
      vertexVal[i] = values[i];
   for (int i = 0; i < n; i++){
      int a, b;
      a = edges[i].first;
      b = edges[i].second;
      vcti[a].push_back(b);
      vcti[b].push_back(a);
   }
   dfs(1, 0);
   for (int i = 1;i <= n; i++){
      if (chk[i]) cout<< i <<endl;
   }
}
int main() {
   n = 5;
   int values[] = {1, 2, 2, 1, 3}; vector<pair<int, int>> edges = {{1, 2}, {2, 3}, {2, 3}, {2, 4}, {4, 5}};
   solve(values, edges);
   return 0;
}

इनपुट

5, {1, 2, 2, 1, 3}, {{1, 2}, {2, 3}, {2, 3}, {2, 4}, {4, 5}}

आउटपुट

1
3
4
5

  1. दिए गए पूर्णांकों से अधिकतम संभव मिलान ज्ञात करने के लिए C++ प्रोग्राम

    मान लीजिए, हमें दो पूर्णांक n और m दिए गए हैं और पूर्णांकों के k टुपल्स हैं जिनमें चार पूर्णांक संख्याएँ {ai, bi, ci, di} हैं। चार सरणियाँ a, b, c, d दिए गए हैं, और a[i] i-th tuple के मान को दर्शाता है। अब, आइए एक अनुक्रम dp पर विचार करें जिसमें n धनात्मक पूर्णांक हैं और 1 <=dp[1]

  1. C++ प्रोग्राम दिए गए ग्राफ़ में ब्रिज किनारों की संख्या का पता लगाने के लिए

    मान लीजिए, हमें एक अभारित, अप्रत्यक्ष ग्राफ दिया गया है जिसमें n कोने और m किनारे हैं। ग्राफ़ में ब्रिज का किनारा वह किनारा होता है जिसके हटाने से ग्राफ़ डिस्कनेक्ट हो जाता है। हमें दिए गए आलेख में ऐसे आलेखों की संख्या ज्ञात करनी है। ग्राफ़ में समानांतर किनारे या सेल्फ़-लूप नहीं होते हैं। इसलिए, यद

  1. C++ प्रोग्राम स्कोर की अधिकतम राशि का पता लगाने के लिए जिसे ग्राफ़ से घटाया जा सकता है

    मान लीजिए, एक भारित, अप्रत्यक्ष ग्राफ है जिसमें n कोने और m किनारे हैं। ग्राफ़ के स्कोर को ग्राफ़ में सभी किनारों के वज़न के योग के रूप में परिभाषित किया गया है। किनारे के वजन नकारात्मक हो सकते हैं, और यदि उन्हें हटा दिया जाता है तो ग्राफ का स्कोर बढ़ जाता है। हमें क्या करना है, हमें ग्राफ को कनेक्ट