ধরুন আমাদের একটি অনির্দেশিত গ্রাফের জন্য একটি প্রান্ত তালিকা রয়েছে যেখানে প্রতিটি প্রান্তে [u, v, w] ক্ষেত্র রয়েছে, u এবং v হল উৎস এবং গন্তব্য শীর্ষবিন্দু এবং w হল ওজন। এবং একই ফর্ম [u, v, w] এর প্রশ্নের একটি তালিকা আছে। এটি এই প্রশ্নের প্রতিনিধিত্ব করে যে u এবং v এর মধ্যে এমন একটি পথ রয়েছে যে পথের প্রতিটি প্রান্তের ওজন সর্বাধিক w হয়। তাই সঠিক প্রশ্নগুলির সংখ্যা খুঁজে বের করুন।
সুতরাং, যদি ইনপুটটি প্রান্তের মত হয় =[[0, 1, 6],[1, 2, 7],[2, 3, 8],[0, 3, 5]] প্রশ্নগুলি =[[0, 2, 14],[1, 0, 3]]
তাহলে আউটপুট হবে 1, কারণ আমরা এই পথ [0, 1, 2] অনুসরণ করে নোড 0 থেকে 2 পর্যন্ত যেতে পারি ওজন 13 সহ। কিন্তু প্রান্ত ওজন 3 সহ 1 থেকে 0 পর্যন্ত কোনো পথ নেই।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি ফাংশন get_parent() সংজ্ঞায়িত করুন, এটি x, একটি অ্যারে par,
- যদি par[x] x না হয়, তাহলে
- par[x] :=get_parent(par[x], par)
- রিটার্ন par[x]
- প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
- একটি 2D অ্যারে gr সংজ্ঞায়িত করুন
- n :=0
- প্রত্যেক প্রান্তের জন্য t প্রান্তে −
- n :=সর্বাধিক n, t[0] এবং t[1]
- জিআর-এ একটি সারি [t[2], 0, t[0], t[1]] ঢোকান
- প্রত্যেকটি প্রশ্নের জন্য t প্রশ্নে −
- জিআর-এ একটি সারি [t[2], 1, t[0], t[1]] ঢোকান
- সর্ট gr
- আকার n + 1 এর একটি অ্যারের সমাহার সংজ্ঞায়িত করুন এবং -1 দিয়ে পূরণ করুন
- আরম্ভ করার জন্য i :=0, যখন i <=n, আপডেট করুন (i 1 দ্বারা বাড়ান), −
- করুন
- পার[i] :=i
- sz :=প্রশ্নের আকার
- উত্তর :=0
- gr
- এ প্রতিটি সারি t এর জন্য
- a :=t[2], b :=t[3], tp :=t[1], d :=t[0]
- px :=get_parent(a, par)
- py :=get_parent(b, par)
- যদি tp 0 এর মত হয়, তাহলে −
- যদি px py এর সমান না হয়, তাহলে −
- par[py] :=px
- যদি px py এর সমান না হয়, তাহলে −
- অন্যথায়
- যদি px py এর মত হয়, তাহলে −
- (উত্তর 1 দ্বারা বৃদ্ধি করুন)
- (1 দ্বারা sz কমিয়ে দিন)
- যদি 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