ধরুন আমাদের একটি শিকড়বিহীন গাছ আছে; এটি একটি অনির্দেশিত গ্রাফ যার কোন চক্র নেই। প্রদত্ত ইনপুটটি হল একটি গ্রাফ যা N নোড সহ একটি ট্রি হিসাবে শুরু হয়েছে (নোডগুলির মানগুলি 1 থেকে N পর্যন্ত স্বতন্ত্র মান), একটি অতিরিক্ত প্রান্ত যুক্ত করা হয়েছে৷ যোগ করা প্রান্তটিতে 1 থেকে N থেকে দুটি ভিন্ন শীর্ষবিন্দু বেছে নেওয়া হয়েছে এবং এটি এমন কোনো প্রান্ত ছিল না যা আগে থেকেই ছিল।
চূড়ান্ত গ্রাফটি প্রান্তের 2D-অ্যারে হিসাবে দেওয়া হয়েছে। প্রান্তগুলির প্রতিটি উপাদান হল একটি জোড়া [u, v] যেখানে u
আমাদের একটি প্রান্ত খুঁজে বের করতে হবে যা সরানো যেতে পারে যাতে ফলস্বরূপ গ্রাফটি N নোডের একটি গাছ হয়। একাধিক উত্তর থাকতে পারে, প্রদত্ত 2Darray-এ শেষ যে উত্তরটি ঘটে তা আমাদের খুঁজে বের করতে হবে। উত্তর প্রান্ত [u, v] একই বিন্যাসে, u
সুতরাং, যদি ইনপুট হয় [[1,2], [2,3], [3,4], [1,4], [1,5]],
তাহলে আউটপুট হবে [1,4]
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
N :=1000
-
আকারের একটি অ্যারে প্যারেন্ট সংজ্ঞায়িত করুন:N+5।
-
আকারের একটি অ্যারে র্যাঙ্ক নির্ধারণ করুন:N+5।
-
একটি ফাংশন getParent() সংজ্ঞায়িত করুন, এটি n,
লাগবে -
যদি অভিভাবক [n] -1 এর মত হয়, তাহলে −
-
ফেরত n
-
-
রিটার্ন প্যারেন্ট[n] =getParent(অভিভাবক[n])
-
একটি ফাংশন unionn() সংজ্ঞায়িত করুন, এটি a, b,
লাগবে -
pa :=getParent(a), pb :=getParent(b)
-
যদি pa pb এর মত হয়, তাহলে −
-
মিথ্যা ফেরত দিন
-
-
যদি rank[pa]> rank[pb] হয়, তাহলে −
-
র্যাঙ্ক[পা] :=র্যাঙ্ক[পা] + র্যাঙ্ক[পিবি]
-
পিতামাতা [pb] :=pa
-
-
অন্যথায়
-
র্যাঙ্ক[পিবি] :=র্যাঙ্ক[পিবি] + র্যাঙ্ক[পিএ]
-
পিতামাতা[pa] :=pb
-
-
প্রত্যাবর্তন সত্য
-
প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
-
n :=প্রান্ত তালিকার আকার
-
আরম্ভ করার জন্য i :=0, যখন i
-
প্যারেন্ট[এজস[i, 0]] :=-1, প্যারেন্ট[এজস[i, 1]] :=- 1
-
র্যাঙ্ক[এজস[i, 0]] :=-1, র্যাঙ্ক[এজস[i, 1]] :=1
-
-
একটি অ্যারে উত্তর সংজ্ঞায়িত করুন
-
আরম্ভ করার জন্য i :=0, যখন i
-
u :=প্রান্ত[i, 0]
-
v :=প্রান্ত[i, 1]
-
যদি unionn(u, v) শূন্য হয়, তাহলে −
-
উত্তর :=প্রান্ত[i]
-
-
-
উত্তর ফেরত দিন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h> using namespace std; void print_vector(vector v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } const int N = 1000; class Solution { public: int parent[N + 5]; int rank[N + 5]; int getParent(int n){ if (parent[n] == -1) return n; return parent[n] = getParent(parent[n]); } bool unionn(int a, int b){ int pa = getParent(a); int pb = getParent(b); if (pa == pb) return false; if (rank[pa] > rank[pb]) { rank[pa] += rank[pb]; parent[pb] = pa; } else { rank[pb] += rank[pa]; parent[pa] = pb; } return true; } vector<int> findRedundantConnection(vector<vector<int>>& edges) { int n = edges.size(); for (int i = 0; i < n; i++) { parent[edges[i][0]] = parent[edges[i][1]] = -1; rank[edges[i][0]] = rank[edges[i][1]] = 1; } vector<int> ans; for (int i = 0; i < n; i++) { int u = edges[i][0]; int v = edges[i][1]; if (!unionn(u, v)) { ans = edges[i]; } } return ans; } }; main(){ Solution ob; vector<vector<int>> v = {{1,2}, {2,3}, {3,4}, {1,4}, {1,5}}; print_vector(ob.findRedundantConnection(v)); }
ইনপুট
{{1,2}, {2,3}, {3,4}, {1,4}, {1,5}}
আউটপুট
[1, 4, ]