কম্পিউটার টিউটোরিয়াল

C++-এ সকল কর্মীকে জানাতে প্রয়োজনীয় সময় গণনা


ধরুন একটি কোম্পানিতে n কর্মী আছে যারা 0 থেকে n - 1 পর্যন্ত ইউনিক ID রাখে। কোম্পানির প্রধান headID। প্রতিটি কর্মীর এক ডায়রেক্ট ম্যানেজার আছে manager অ্যারেতে দেওয়া, যেখানে manager[i] i-তম কর্মীর ডায়রেক্ট ম্যানেজার, manager[headID] = -1। এছাড়া গ্যারান্টি আছে যে সাবঅর্ডিনেশন রিলেশনশিপ ট্রি-লিক স্ট্রাকচার। কোম্পানির প্রধান সব কর্মীকে একটি জরুরি খবর জানাতে চান। সে তার ডায়রেক্ট সাবঅর্ডিনেটদের জানাবে, তারা তাদের সাবঅর্ডিনেটদের জানাবে এবং এভাবে চলবে যতক্ষণ না সবাই জানে। i-তম কর্মী তার সকল ডায়রেক্ট সাবঅর্ডিনেটকে জানাতে informTime[i] মিনিট নেয় (তাই informTime[i] মিনিট পরে তার সাবঅর্ডিনেটরা খবর ছড়িয়ে দিতে শুরু করবে)। সকল কর্মীকে খবর দেওয়ার জন্য প্রয়োজনীয় মিনিটের সংখ্যা বের করতে হবে। ইনপুট n = 6, headID = 2, manager = [2,2,-1,2,2,2], informTime = [0,0,1,0,0,0] হলে আউটপুট হবে ১।

C++-এ সকল কর্মীকে জানাতে প্রয়োজনীয় সময় গণনা

সমাধানের ধাপগুলো:

  • ret := 0

  • সাইজ n-এর একটি graph অ্যারে ডিফাইন করুন, root := -1 সেট করুন

  • i = 0 থেকে manager array-এর সাইজ পর্যন্ত লুপ চালান

    • u := manager[i], v := i

    • যদি u == -1 হয়, তবে root := v সেট করুন এবং পরবর্তী ইটারেশনে যান

    • graph[u]-তে v ইনসার্ট করুন

  • একটি কিউ q ডিফাইন করুন, q-তে root ইনসার্ট করুন, এবং সাইজ n-এর একটি time অ্যারে ডিফাইন করুন

  • যখন q খালি নয়

    • curr := q-এর ফ্রন্ট এলিমেন্ট, q থেকে পপ করুন

    • যদি graph[curr]-এর সাইজ 0 হয়, তবে পরবর্তী ইটারেশনে যান

    • i = 0 থেকে graph[curr]-এর সাইজ পর্যন্ত লুপ চালান

      • graph[curr][i] q-তে পশ করুন

      • time[graph[curr][i]] := time[curr] + informTime[curr]

  • i = 0 থেকে n – 1 পর্যন্ত: ret := max(ret, time[i])

  • ret রিটার্ন করুন

উদাহরণ (C++)

নিচের ইমপ্লিমেন্টেশন দেখুন ভালো বুঝতে −

#include <bits/stdc++.h> using namespace std; class Solution { public:    int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {       int ret = 0;       vector <int> graph[n];       int root = -1;       for(int i = 0; i < manager.size(); i++){          int u = manager[i];          int v = i;          if(u == -1) {             root = v;             continue;          }          graph[u].push_back(v);       }       queue <int> q;       q.push(root);       vector <int> time(n);       while(!q.empty()){          int curr = q.front();          q.pop();          if(!graph[curr].size()) continue;          for(int i = 0; i < graph[curr].size(); i++){             q.push(graph[curr][i]);             time[graph[curr][i]] = time[curr] + informTime[curr];          }       }       for(int i = 0; i <n; i++)ret = max(ret, time[i]);       return ret;    } }; main(){    vector<int> v = {2,2,-1,2,2,2}, v1 = {0,0,1,0,0,0};    Solution ob;    cout << (ob.numOfMinutes(6, 2, v, v1)); }

ইনপুট

6 2 [2,2,-1,2,2,2] [0,0,1,0,0,0]

আউটপুট

1
  1. C++ কোড: সব টাস্ক সম্পন্ন করতে ন্যূনতম সময় বের করা

  2. অ্যারেতে সব জোড়ার যোগফলের XOR-এর যোগফল C++-তে

  3. C++-এ ট্রিতে সব আপেল কালেক্ট করতে ন্যূনতম সময়

  4. C++-তে অ্যারেতে থাকা সব প্রাইম নম্বরের গুণফল বের করা