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

इसलिए, यदि इनपुट 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