কম্পিউটার

C++ এ অপ্রয়োজনীয় সংযোগ


ধরুন আমাদের একটি শিকড়বিহীন গাছ আছে; এটি একটি অনির্দেশিত গ্রাফ যার কোন চক্র নেই। প্রদত্ত ইনপুটটি হল একটি গ্রাফ যা N নোড সহ একটি ট্রি হিসাবে শুরু হয়েছে (নোডগুলির মানগুলি 1 থেকে N পর্যন্ত স্বতন্ত্র মান), একটি অতিরিক্ত প্রান্ত যুক্ত করা হয়েছে৷ যোগ করা প্রান্তটিতে 1 থেকে N থেকে দুটি ভিন্ন শীর্ষবিন্দু বেছে নেওয়া হয়েছে এবং এটি এমন কোনো প্রান্ত ছিল না যা আগে থেকেই ছিল।

চূড়ান্ত গ্রাফটি প্রান্তের 2D-অ্যারে হিসাবে দেওয়া হয়েছে। প্রান্তগুলির প্রতিটি উপাদান হল একটি জোড়া [u, v] যেখানে u

আমাদের একটি প্রান্ত খুঁজে বের করতে হবে যা সরানো যেতে পারে যাতে ফলস্বরূপ গ্রাফটি N নোডের একটি গাছ হয়। একাধিক উত্তর থাকতে পারে, প্রদত্ত 2Darray-এ শেষ যে উত্তরটি ঘটে তা আমাদের খুঁজে বের করতে হবে। উত্তর প্রান্ত [u, v] একই বিন্যাসে, u সহ হওয়া উচিত

সুতরাং, যদি ইনপুট হয় [[1,2], [2,3], [3,4], [1,4], [1,5]],

C++ এ অপ্রয়োজনীয় সংযোগ

তাহলে আউটপুট হবে [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, ]

  1. C++ এ ডায়াগোনাল ট্রাভার্স II

  2. C++ এ কিল প্রসেস

  3. C++ এ কাঠবিড়ালি সিমুলেশন

  4. C++ এ আয়তক্ষেত্র ক্ষেত্র II