ডিনিকের অ্যালগরিদম (Dinic's Algorithm)
ধরুন আপনি কিছু প্যাকেজ শিপিং বা পাঠাচ্ছেন এবং আপনি গুদামঘর বা ওয়্যারহাউস থেকে ডেলিভারি হাব (delivery hub) পর্যন্ত ডেলিভারির সম্ভাব্য প্রতিটি সবচেয়ে ছোট রুট বা রুট (route) খুঁজে পেয়েছেন। এডমন্ডস-কার্প (Edmonds-Karp) অ্যালগরিদম প্যাকেজগুলোকে একটি একটি রুট ধরে পাঠায়, এবং তারপর আবার সবকিছু পুনরায় পরীক্ষা করে বা রি-চেক (re-checks) করে। অন্যদিকে ডিনিকের (Dinic's) কথা হলো: সমস্ত সবচেয়ে ছোট রুট বা রুট (shortest routes) দিয়ে একইসাথে প্যাকেজগুলোকে পাঠান, এবং তারপর পুনরায় মূল্যায়ন বা রি-ইভ্যালুয়েশন (re-evaluate) করুন। আর এটিই হলো এর পেছনের মূল ধারণা।
এই ব্যাচ বা এক ধাপে সম্পন্ন করা পদ্ধতিটিকে মূলত একটি ব্লকিং ফ্লো (blocking flow) বা বাধাদানকারী প্রবাহ বলা হয় — যা বাস্তবে ডিনিকের (Dinic's) অ্যালগরিদমকে চমৎকারভাবে দ্রুতগতি সম্পন্ন করে তোলে এবং থিওরি বা তত্ত্বগতভাবেও একে আরও উন্নত করে তোলে বা বেটার (better) প্রমাণ করে।
1ম পর্যায়: লেভেল গ্রাফ তৈরি করা (Phase 1: Build the Level Graph) (BFS)
প্রতিটি পর্যায় বা ফেজকে (phase) সোর্স বা উৎস s থেকে রেসিডুয়াল গ্রাফ (residual graph) এর দিকে একটি BFS দিয়ে শুরু করুন। এরপর প্রতিটি ভার্টেক্সে (vertex) লেভেল (level) নির্ধারণ করুন যা মূলত এজ বা প্রান্তের (edges) সংখ্যায় s থেকে এর দূরত্বের সমান।
এই লেভেল গ্রাফ (level graph) টি শুধুমাত্র সেই এজগুলিকেই (u→v) ধরে রাখে যেখানে level[v] = level[u] + 1 — এগুলো হলো সেই এজগুলো যা মূলত সিঙ্কের (sink) দিকে কঠোরভাবে এগিয়ে নিয়ে যায়। লেভেল গ্রাফের সমস্ত s-t পাথ বা পথের (paths) ন্যূনতম দৈর্ঘ্যটি সমান বা একই হতে হয়। আর যদি সিঙ্ক t পৌঁছানো না যায় (unreachable), তবে ধরে নিতে হবে যে অ্যালগরিদমটি তার কাজ বন্ধ করে দিয়েছে (কারণ তখন ম্যাক্স ফ্লো (max flow) বা সর্বোচ্চ প্রবাহটি পাওয়া হয়ে গিয়েছে)।
২য় পর্যায়: একটি ব্লকিং ফ্লো খোঁজা বা ফাইন্ড করা (Phase 2: Find a Blocking Flow) (DFS)
একটি ব্লকিং ফ্লো বা বাধাদানকারী প্রবাহ হলো মূলত লেভেল গ্রাফের (level graph) এমন একটি ফ্লো বা প্রবাহ যেখানে প্রত্যেকটি s-t পাথে কমপক্ষে একটি করে স্যাচুরেটেড এজ (saturated edge) বা পরিপৃক্ত প্রান্ত থাকে। একটি ব্লকিং ফ্লো পাঠানোর পরে, লেভেল গ্রাফে কোনো s-t পাথ আর অবশিষ্ট থাকে না — যা পরবর্তী BFS কলটিকে আরও লম্বা পাথ বা পথ (longer paths) খুঁজে বের করতে বাধ্য করে।
এই ব্লকিং ফ্লো-টি খুঁজতে একটি "ডেড এন্ড" অপ্টিমাইজেশন (dead end optimization) সহ মূলত DFS ব্যবহার করা হয়: যখন আপনি এমন একটি ডেড এন্ডে বা মৃত প্রান্তে (যেখানে যাওয়ার জন্য আর কোনো সামনের দিকের এজ বাকি থাকে না) পৌঁছবেন তখন লেভেল গ্রাফ বা level graph থেকে সেই ভার্টেক্সটিকে মুছে ফেলবেন বা ডিলিট করবেন, যাতে আপনি আর কখনোই সেই পাতায় ফিরে যাবেন না বা চেষ্টা করবেন না। যখন আপনি t এ পৌঁছাবেন, তখন পাথ বরাবর ফ্লো বা প্রবাহটি (flow) পিছনের দিকে পাঠান, যা এর বটলনেক (bottleneck) এজটিকে স্যাচুরেট (saturating) করবে বা ভর্তি করবে। প্রতিটি এজ সর্বাধিক একবার ডিলিট বা মুছে ফেলা হয়, যার কারণে পুরো ব্লকিং ফ্লো পর্যায়টি বা ফেজটি সম্পন্ন করতে মোট খরচের পরিমাণ হয় \(O(VE)\)।
কেন প্রতিটি পর্যায়ে (Phase) পাথ বা পথের দৈর্ঘ্য (Path Length) বৃদ্ধি পায়
একটি ব্লকিং ফ্লো বা প্রবাহ (blocking flow) সম্পন্ন হবার পর, বর্তমান লেভেল গ্রাফের (level graph) সমস্ত s-t পাথগুলো ভেঙে ফেলা হয়। এর পরবর্তী BFS কলটিকে অবশ্যই একটি কঠোরভাবে দীর্ঘতর শর্টেস্ট পাথ (longest shortest path) খুঁজে পেতে হবে। যেহেতু পাথের দৈর্ঘ্যগুলো সর্বাধিক V-1 পর্যন্ত হতে পারে, তাই এতে সর্বোচ্চ \(O(V)\) টি পর্যায় বা ফেজ (phases) থাকতে পারে।
প্রতিটি পর্যায়ে: একটি BFS = \(O(E)\) এবং একটি ব্লকিং ফ্লো বা ফ্লো = \(O(VE)\) হয়ে থাকে। সর্বমোট: \(O(V)\) × \(O(VE)\) = \(O(V^2E)\)।
ইউনিট ক্যাপাসিটি নেটওয়ার্ক ও বাইপার্টাইট ম্যাচিং (Unit Capacity Networks and Bipartite Matching)
যখন সমস্ত ক্যাপাসিটিগুলোর বা ক্ষমতার মান 1 হয়, তখন ব্লকিং ফ্লো-গুলো (blocking flows) এজগুলোকে খুব দ্রুত স্যাচুরেট (saturate) বা ভর্তি করে ফেলে এবং পাথের (path) দৈর্ঘ্য আরও দ্রুতগতিতে বৃদ্ধি পায়। পর্যায় বা ফেজের সংখ্যাটি সাধারণভাবে কমে গিয়ে \(O(\sqrt{E})\) তে গিয়ে নামে এবং বাইপার্টাইট গ্রাফের (bipartite graphs) ক্ষেত্রে সেটি \(O(\sqrt{V})\)-এ নেমে আসে। তাই সর্বমোট কমপ্লেক্সিটি (complexity): \(O(E\sqrt{V})\) — হপক্রফ্ট-কার্প (Hopcroft-Karp) ম্যাচিং অ্যালগরিদমও (matching algorithm) একদম ঠিক একই বাউন্ড বা সীমায় অর্জিত হয়ে থাকে (যা মূলত বাইপার্টাইট গ্রাফে বা bipartite graphs এ ডিনিকের প্রয়োগ বা অ্যাপ্লাই করা ছাড়া আর কিছুই নয়)।
ডিনিকের অ্যালগরিদম (Dinic's Algorithm)
Complexity
ছোট কুইজ
পড়া চালিয়ে যান