मान लीजिए कि हमारे पास एक अप्रत्यक्ष ग्राफ के लिए किनारे की सूची है जहां प्रत्येक किनारे में [यू, वी, डब्ल्यू] फ़ील्ड हैं, यू और वी स्रोत और गंतव्य शिखर हैं और डब्ल्यू वजन है। और उसी फॉर्म [यू, वी, डब्ल्यू] के प्रश्नों की एक सूची भी है। यह इस प्रश्न का प्रतिनिधित्व करता है कि क्या u और v के बीच कोई पथ मौजूद है जैसे कि पथ के प्रत्येक किनारे का भार अधिकतम w है। तो उन प्रश्नों की संख्या ज्ञात करें जो सत्य हैं।
इसलिए, यदि इनपुट किनारों की तरह है =[[0, 1, 6], [1, 2, 7], [2, 3, 8], [0, 3, 5]] प्रश्न =[[0, 2, 14],[1, 0, 3]]

तो आउटपुट 1 होगा, क्योंकि हम वजन 13 के साथ इस पथ [0, 1, 2] का अनुसरण करके नोड 0 से 2 तक जा सकते हैं। लेकिन किनारे के वजन के साथ 1 से 0 तक कोई रास्ता नहीं है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक फ़ंक्शन को परिभाषित करें get_parent(), यह x, एक सरणी सममूल्य लेगा,
- यदि par[x] x नहीं है, तो
- बराबर[x] :=get_parent(par[x], par)
- रिटर्न पार[x]
- मुख्य विधि से निम्न कार्य करें -
- एक 2डी सरणी जीआर परिभाषित करें
- n :=0
- किनारों में प्रत्येक किनारे t के लिए −
- n :=अधिकतम n, t[0] और t[1]
- एक पंक्ति डालें [t[2], 0, t[0], t[1]] gr में
- प्रश्नों में प्रत्येक प्रश्न t के लिए −
- एक पंक्ति डालें [t[2], 1, t[0], t[1]] gr में
- सॉर्ट जीआर
- आकार n + 1 के सरणी बराबर को परिभाषित करें और -1 से भरें
- इनिशियलाइज़ i :=0 के लिए, जब i <=n, अपडेट करें (i को 1 से बढ़ाएँ), −
- करें
- बराबर[i] :=मैं
- sz :=प्रश्नों का आकार
- उत्तर:=0
- ग्र में प्रत्येक पंक्ति टी के लिए
- ए:=टी[2], बी:=टी[3], टीपी:=टी[1], डी:=टी[0]
- px :=get_parent(a, par)
- py :=get_parent(b, par)
- यदि tp, 0 के समान है, तो −
- यदि px, py के बराबर नहीं है, तो −
- बराबर[py] :=px
- यदि px, py के बराबर नहीं है, तो −
- अन्यथा
- यदि px, py के समान है, तो −
- (उत्तर 1 से बढ़ाएं)
- (sz को 1 से घटाएं)
- यदि sz 0 के समान है, तो −
- लूप से बाहर आएं
- यदि px, py के समान है, तो −
- वापसी उत्तर
उदाहरण (C++)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h>
using namespace std;
int get_parent(int x, vector<int>& par) {
if (par[x] != x) {
par[x] = get_parent(par[x], par);
}
return par[x];
}
int solve(vector<vector<int>>& edges, vector<vector<int>>& queries) {
vector<vector<int>> gr;
int n = 0;
for (auto t : edges) {
n = max(n, max(t[0], t[1]));
gr.push_back({t[2], 0, t[0], t[1]});
}
for (auto t : queries) {
gr.push_back({t[2], 1, t[0], t[1]});
}
sort(gr.begin(), gr.end());
vector<int> par(n + 1, -1);
for (int i = 0; i <= n; i++) {
par[i] = i;
}
int sz = queries.size();
int ans = 0;
for (auto t : gr) {
int a = t[2];
int b = t[3];
int tp = t[1];
int d = t[0];
int px = get_parent(a, par);
int py = get_parent(b, par);
if (tp == 0) {
if (px != py) {
par[py] = px;
}
}else {
if (px == py) {
ans++;
}
sz--;
if(sz == 0) {
break;
}
}
}
return ans;
}
int main(){
vector<vector<int>> edges = {{0, 1, 6},{1, 2, 7},{2, 3, 8},{0, 3, 5}};
vector<vector<int>> queries = {{0, 2, 14},{1, 0, 3}};
cout << solve(edges, queries);
} इनपुट
{{0, 1, 6},{1, 2, 7},{2, 3, 8},{0, 3, 5}}, {{0, 2, 14},{1, 0, 3}} आउटपुट
1