অয়লারীয় পথ ও সার্কিট (Eulerian Path & Circuit)
১৭৩৬ সালে কোনিগসবার্গ (Königsberg) শহরে সাতটি সেতু ছিল যেগুলো এর বিভিন্ন দ্বীপগুলোকে সংযুক্ত করত। একটি স্থানীয় ধাঁধা ছিল: আপনি কি পুরো শহরটি এমনভাবে ঘুরতে পারবেন যেখানে প্রতিটি সেতু আপনি ঠিক একবারই পার হবেন এবং সবশেষে পুনরায় আপনার ঘরে ফিরে আসবেন?
লিওনার্ড অয়লার (Leonhard Euler) প্রমাণ করেছিলেন যে এটি অসম্ভব — এবং তা করতে গিয়েই তিনি বর্তমানের গ্রাফ থিওরি (graph theory) আবিষ্কার করেছিলেন। তিনি যে মূল ধারণাটি খুঁজে পেয়েছিলেন তা আজও সমানভাবে কার্যকর: আপনি পুরো ধাঁধাটি সমাধান করতে পারেন শুধুমাত্র প্রতিটি ভূখণ্ড বা ল্যান্ডমাসের সাথে কতগুলো সেতু সংযুক্ত আছে তা দেখে।
দুটি মূল প্রশ্ন
একটি অয়লারীয় সার্কিট (Eulerian circuit) একই জায়গা থেকে শুরু এবং শেষ হয়, যেখানে প্রতিটি এজ বা সংযোগ ঠিক একবার ব্যবহার করা হয় (যেমন সব ব্রিজ পার হওয়ার পর বাড়ি ফিরে আসা)। অন্যদিকে, একটি অয়লারীয় পথ (Eulerian path) প্রতিটি এজ ঠিক একবার ব্যবহার করে ঠিকই, তবে এটি শুরুর স্থান থেকে ভিন্ন অন্য কোনো স্থানে গিয়ে শেষ হতে পারে।
ম্যাজিক ডিগ্রি কন্ডিশন (আনডিরেক্টেড বা অনির্দেশিত গ্রাফ)
প্রতিবার যখন আপনি একটি ব্রিজের মাধ্যমে কোনো নোডে বা ভার্টেক্সে প্রবেশ করেন, তখন ফিরে যাওয়ার জন্য আপনার আরও একটি ব্রিজের প্রয়োজন হয় — যদি না এটি একেবারে শুরু বা শেষের বিন্দু হয়। এর মানে হলো:
- অয়লারীয় সার্কিট তখনই সম্ভব ↔ যখন গ্রাফটি সংযুক্ত থাকে এবং প্রতিটি ভার্টেক্সের ডিগ্রি (degree) অবশ্যই জোড় (even) হয়।
- অয়লারীয় পথ তখনই সম্ভব ↔ যখন গ্রাফটি সংযুক্ত থাকে এবং ঠিক দুটি ভার্টেক্সের ডিগ্রি বেজোড় (odd) হয় (সেই দুটি ভার্টেক্সই হলো এর শুরু এবং শেষ)।
কোনিগসবার্গের সেই ধাঁধায় চারটি ভূখণ্ডই ছিল বেজোড় ডিগ্রির — তাই এর সার্কিট বা পথ কোনটিই সম্ভব ছিল না। অয়লার মাত্র কয়েক সেকেন্ডে এটি দেখতে পেয়েছিলেন।
ডিরেক্টেড বা নির্দেশিত গ্রাফ (Directed Graphs)
ডিরেক্টেড গ্রাফের ক্ষেত্রে, "জোড় ডিগ্রি" এর বদলে ব্যালেন্সড ইন/আউট-ডিগ্রি (in/out-degree) হিসেবে চিন্তা করুন: একটি অয়লারীয় সার্কিট-এর জন্য প্রতিটি ভার্টেক্সের ইন-ডিগ্রি = আউট-ডিগ্রি হওয়া প্রয়োজন। একটি অয়লারীয় পথ-এর জন্য ঠিক একটি ভার্টেক্সের আউট-ডিগ্রি = ইন-ডিগ্রি + 1 (শুরু) এবং একটির ইন-ডিগ্রি = আউট-ডিগ্রি + 1 (শেষ) হতে হবে।
হায়ারহোলজারের অ্যালগরিদম (Hierholzer's Algorithm): পথ তৈরি করা
পথটি আদৌ সম্ভব কিনা তা যাচাই করা বেশ তুচ্ছ একটি কাজ — তবে আসলে পথটি তৈরি করতে একটু বেশি বুদ্ধিমত্তার প্রয়োজন হয়। হায়ারহোলজারের পদ্ধতিটি ঠিক এইভাবে কাজ করে:
- যেকোনো জায়গা থেকে শুরু করুন এবং গ্রিডি বা লোভী হয়ে একে একে এজগুলো অনুসরণ করতে থাকুন (ব্যবহৃত এজগুলোকে চিহ্নিত করে রাখুন) যতক্ষণ না আপনি কোথাও আটকে যান — এটি আপনাকে একটি সার্কিট দেবে, তবে এটি হয়তো সব এজকে কভার নাও করতে পারে।
- আপনার তৈরি করা সার্কিটে এমন কোনো ভার্টেক্স খুঁজুন যার এজগুলো এখনো ব্যবহার করা হয়নি। সেখান থেকে নতুন একটি মিনি-সার্কিট শুরু করুন।
- এই মিনি-সার্কিটটিকে আগের মূল বা মেইন সার্কিটের সেই ভার্টেক্সের অবস্থানেই জোড়া বা স্প্লাইস (splice) করে দিন।
- যতক্ষণ পর্যন্ত কোনো অব্যবহৃত এজ অবশিষ্ট থাকে, ততক্ষণ পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি করতে থাকুন।
সঠিক ডেটা স্ট্রাকচার (যেমন একটি ডাবলি-লিঙ্কড লিস্ট) ব্যবহার করলে প্রতিটি স্প্লাইস করতে মাত্র \(O(1)\) সময় লাগে, যা আপনাকে সর্বমোট \(O(V+E)\) সময় দেয়।
অয়লারীয় পথ — হায়ারহোলজারের অ্যালগরিদম
Complexity
ছোট কুইজ
পড়া চালিয়ে যান