কম্পিউটার

একটি গাছে ভেঙ্গে যেতে পারে এমন প্রান্তের সংখ্যা নির্ণয় করুন যাতে বিটওয়াইজ বা ফলস্বরূপ দুটি গাছ C++ এ সমান হয়


ধারণা

m নোড এবং প্রতিটি নোডের সাথে যুক্ত একটি সংখ্যা সহ একটি প্রদত্ত গাছের ক্ষেত্রে, আমরা যে কোনও গাছের প্রান্ত ভেঙে ফেলতে পারি যার ফলে 2টি নতুন গাছ তৈরি হবে। এখানে, আমাদেরকে এইভাবে প্রান্তের সংখ্যা গণনা করতে হবে যাতে সেই প্রান্তটি ভাঙার পরে নির্মিত দুটি গাছে উপস্থিত নোডগুলির বিটওয়াইজ OR সমান হয়। এটি লক্ষ করা উচিত যে প্রতিটি নোডের মান হল ≤ 10^6।

ইনপুট

মান[]={1, 3, 1, 3} 1 / | \ 2 3 4

আউটপুট

2

এখানে, 1 এবং 2-এর মধ্যে প্রান্তটি ভাঙ্গা যেতে পারে, ফলে দুটি গাছের বিটওয়াইজ OR হবে 3।

একইভাবে, 1 এবং 4-এর মধ্যে প্রান্তটিও ভেঙে যেতে পারে।

পদ্ধতি

এখানে, উপরে উল্লিখিত সমস্যাটি সহজ DFS (গভীরতার প্রথম অনুসন্ধান) বাস্তবায়নের মাধ্যমে সমাধান করা যেতে পারে। কারণ নোডের মান ≤ 10^6, এটি 22টি বাইনারি বিট প্রয়োগ করে উপস্থাপন করা যেতে পারে। এর ফলস্বরূপ, নোডের মানের Bitwise OR 22টি বাইনারি বিটেও উপস্থাপন করা যেতে পারে। এখানে, পদ্ধতিটি হল asub-tree-এর সমস্ত মানগুলিতে প্রতিটি বিট কতবার সেট করা হয়েছে তা নির্ধারণ করা। প্রতিটি প্রান্তের জন্য আমরা যাচাই করব যে 0 থেকে 21 পর্যন্ত প্রতিটি বিটের সাপেক্ষে নির্দিষ্ট বিটের সাথে সেট করা সংখ্যাগুলি ফলস্বরূপ উভয় গাছে শূন্য বা উভয় গাছে শূন্যের চেয়ে বেশি এবং যদি দেখা যায় যে শর্তটি সন্তুষ্ট। সমস্ত বিটের জন্য তারপর সেই প্রান্তটি ফলাফলে গণনা করা হয়।

উদাহরণ

নেমস্পেস std;int m1[1000],x1[22];// প্রতিটি বিট// সেট করা কতবার সঞ্চয় করার জন্য অ্যারে ব্যবহার করে একটি সাবট্রিইন্ট a1[1000][22];ভেক্টর<ভেক্টর> g;int ans1 =0;// সাধারণ DFSvoid dfs(int u1, int p1){এর জন্য (int i =0;i 0 &&x1[i] - a1[u1][i]> 0) || (a1[u1] ][i] ==0 &&x1[i] ==0))) { pp1 =1; বিরতি } } if (pp1 ==0) ans1++;}// ড্রাইভার কোডইন্ট মেইন(){ // নোডের সংখ্যা int n1 =4; // int n1 =5; // ট্রি সংরক্ষণ করতে ArrayList ব্যবহার করে g.resize(n1+1); // নোডের মান সঞ্চয় করতে অ্যারে ব্যবহার করে m1[1] =1; m1[2] =3; m1[3] =1; m1[4] =3; /* m1[1] =2; m1[2] =3; m1[3] =32; m1[4] =43; m1[5] =8;*/ //প্রতিটি বিট // (int i =1; i <=n1; i++) { int y1 =m1[i]; int k1 =0; // নোড i এর মানের সেট বিট নির্ধারণ করা যখন (y1 !=0) { int p1 =y1 % 2; যদি (p1 ==1) { x1[k1]++; a1[i][k1]++; } y1 =y1/2; k1++; } } // push_back edges g[1].push_back(2); g[2]. push_back(1); g[1]. push_back(3); g[3]. push_back(1); g[1]. push_back(4); g[4]. push_back(1); //g[1].push_back(5); //g[5].push_back(1); dfs(1, 0); cout<<(ans1);}

আউটপুট

2

  1. C++ এ দুটি ম্যাট্রিক্সকে সমান করতে রূপান্তরের সংখ্যা খুঁজুন

  2. অনন্য জোড়া খুঁজুন যাতে প্রতিটি উপাদান C++ এ N এর থেকে কম বা সমান হয়

  3. দুটি সেটের সর্বাধিক যোগফল খুঁজে বের করার প্রোগ্রাম যেখানে যোগফল C++ এ সমান

  4. বাইনারি ট্রিতে নোডের সর্বাধিক যোগফল যেমন C++ প্রোগ্রামে ডায়নামিক প্রোগ্রামিং ব্যবহার করে দুটি সংলগ্ন নয়