ধরুন বন্ধুদের একটি দল ছুটিতে গিয়েছিল এবং কখনও কখনও তারা একে অপরকে টাকা ধার দেয়৷ তাই উদাহরণ হিসেবে, অমিত বিক্রমের মধ্যাহ্নভোজের জন্য $10 দিয়েছিলেন। পরে চন্দন অমিতকে ট্যাক্সি ভাড়ার জন্য ৫ ডলার দেয়। আমাদের এমন একটি মডেল ডিজাইন করতে হবে যেখানে প্রতিটি লেনদেন একটি টিপল (x, y, z) হিসাবে নেওয়া হয় যার অর্থ ব্যক্তি x ব্যক্তিকে y $z দিয়েছে।
অমিত, বিক্রম এবং চন্দন যথাক্রমে ব্যক্তি 0, 1, এবং 2 অনুমান করে লেনদেনগুলিকে [[0, 1, 10], [2, 0, 5]] হিসাবে উপস্থাপন করা যেতে পারে। যদি আমাদের একটি গোষ্ঠীর মধ্যে লেনদেনের একটি তালিকা থাকে, তাহলে আমাদের ঋণ নিষ্পত্তির জন্য প্রয়োজনীয় ন্যূনতম সংখ্যক লেনদেন খুঁজে বের করতে হবে৷
সুতরাং, যদি ইনপুটটি [[0,1,10], [2,0,5]] এর মত হয়, তাহলে আউটপুট হবে 2, যেমন ব্যক্তি #0 দিয়েছে ব্যক্তি #1 $10। তারপর ব্যক্তি #2 ব্যক্তিকে #0 $5 দিয়েছে। এখানে দুটি লেনদেন প্রয়োজন। ঋণ নিষ্পত্তির একটি উপায় হল ব্যক্তি #1 ব্যক্তিকে #0 এবং #2 প্রত্যেককে $5 প্রদান করে।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি অ্যারে v
সংজ্ঞায়িত করুন -
একটি ফাংশন সংজ্ঞায়িত করুন dfs(), এটি idx লাগবে,
-
ret :=inf
-
যখন (idx
করুন -
(আইডিএক্স 1 দ্বারা বাড়ান)
-
-
আরম্ভ করার জন্য i :=idx + 1, যখন i − এর আকার v, আপডেট করুন (i 1 দ্বারা বাড়ান), করবেন −
-
যদি v[i] * v[idx] <0 হয়, তাহলে −
-
v[i] :=v[i] + v[idx]
-
ret :=সর্বনিম্ন ret এবং 1 + dfs(idx + 1)
-
v[i] :=v[i] - v[idx]
-
-
-
রিটার্ন (যদি ret একই হয় inf, তাহলে 0, অন্যথায় ret)
-
প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
-
একটি মানচিত্র m
সংজ্ঞায়িত করুন -
n :=t এর আকার
-
আরম্ভ করার জন্য i :=0, যখন i
-
u :=t[i, 0], v :=t[i, 1]
-
bal :=t[i, 2]
-
m[u] :=m[u] + bal
-
m[v] :=m[v] - bal
-
-
প্রতিটি কী-মানের জোড়ার জন্য i তে m, do −
-
যদি i এর মান হয়, তাহলে −
-
v
এর শেষে i এর মান সন্নিবেশ করান
-
-
(i 1 দ্বারা বাড়ান)
-
-
ন্যূনতম dfs(0) এবং v
এর আকার ফেরত দিন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<int> v;
int dfs(int idx) {
int ret = INT_MAX;
while (idx < v.size() && !v[idx])
idx++;
for (int i = idx + 1; i < v.size(); i++) {
if (v[i] * v[idx] < 0) {
v[i] += v[idx];
ret = min(ret, 1 + dfs(idx + 1));
v[i] -= v[idx];
}
}
return ret == INT_MAX ? 0 : ret;
}
int minTransfers(vector<vector<int>>&t) {
map<int, int> m;
int n = t.size();
for (int i = 0; i < n; i++) {
int u = t[i][0];
int v = t[i][1];
int bal = t[i][2];
m[u] += bal;
m[v] -= bal;
}
map<int, int>::iterator i = m.begin();
while (i != m.end()) {
if (i->second)
v.push_back(i->second);
i++;
}
return min(dfs(0), (int)v.size());
}
};
main() {
Solution ob;
vector<vector<int>> v = {{0,1,10},{2,0,5}};
cout << (ob.minTransfers(v));
} ইনপুট
{{0,1,10},{2,0,5}} আউটপুট
2