nটি ৩-ডাইমেনশনাল কোঅর্ডিনেট দেওয়া আছে। কোঅর্ডিনেট (a,b,c) থেকে (x,y,z) যাওয়ার খরচ:
|x - a| + |y - b| + max(0, z - c)
প্রথম কোঅর্ডিনেট থেকে শুরু করে সব কোঅর্ডিনেট কমপক্ষে একবার ভ्रमণ করে আবার প্রথম কোঅর্ডিনেটে ফিরে আসতে হবে। মোট খরচ বের করুন।
উদাহরণ
ইনপুট: n = 3, coords = {{1,1,0}, {1,3,4}, {3,2,2}}
আউটপুট: 12
অ্যালগরিদম (বিটমাস্ক DP / TSP ভেরিয়েন্ট)
tpa[mask][last]=maskসেটের নোডগুলো ভিজিট করেlastনোডে থাকার মিনিমাম খরচ।- ইনিশিয়াল:
tpa[1][0] = 0(শুধু নোড ০ ভিজিট করা)। - সব মাস্কের জন্য ট্রানজিশন: নতুন নোড
tযোগ করলে খরচ আপডেট। - শেষে সব নোড ভিজিট করা মাস্ক (
(1<) থেকে নোড ০-এ ফেরার খরচ যোগ করে মিনিমাম বের করুন।
C++ প্রোগ্রাম
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int solve(int n, vector<tuple<int,int,int>> coords) {
vector<vector<int>> tpa(1 << n, vector<int>(n, INF));
tpa[1][0] = 0;
for (int mask = 1; mask < (1 << n); mask++) {
for (int j = 0; j < n; j++) {
if (mask % 2 == 0) continue; // অপ্টিমাইজেশন
for (int t = 0; t < n; t++) {
int x, y, z, p, q, r;
tie(x, y, z) = coords[t];
tie(p, q, r) = coords[j];
int cost = abs(x - p) + abs(y - q) + max(0, z - r);
tpa[mask | (1 << t)][t] = min(tpa[mask | (1 << t)][t], tpa[mask][j] + cost);
}
}
}
int res = INF;
for (int i = 0; i < n; i++) {
int x, y, z, p, q, r;
tie(x, y, z) = coords[0];
tie(p, q, r) = coords[i];
int cost = abs(x - p) + abs(y - q) + max(0, z - r);
res = min(res, tpa[(1 << n) - 1][i] + cost);
}
return res;
}
int main() {
int n = 3;
vector<tuple<int,int,int>> coords = {{1,1,0},{1,3,4},{3,2,2}};
cout << solve(n, coords);
return 0;
}
আউটপুট
12
ব্যাখ্যা
- স্টেট:
mask= ভিজিট করা নোডগুলো,last= বর্তমান নোড। - ট্রানজিশন:
maskথেকে নতুন নোডtযোগ। - কমপ্লেক্সিটি:
O(n^2 * 2^n)— ছোটn(≤15-20) এর জন্য কাজ করে। max(0, z-c)এর মানে: যাত্রা উপরের দিকে (z বাড়ানোর সময়) খরচ হয়, নিচের দিকে নয়।