تطابق در گراف های عام ======================== در فصل های قبل شرط لازم و کافی برای وجود داشتن تطابق کامل در گراف های دوبخشی را بررسی کردیم. در این قسمت وجود تطابق کامل در هر گرافی را بررسی خواهیم کرد. قضیه تات ------------------- به ازای هر زیر مجموعه :math:`S` از راس ها (که می تواند تهی نیز باشد) فرض کنید :math:`O(S)` برابر با تعداد مولفه های همبندی با اندازه فرد باشد در صورتیکه رئوس :math:`S` را از گراف حذف کرده باشیم. قضیه تات بیان می کند شرط زیر لازم و کافی می باشد : :math:`\forall_S : |S| \geq O(S)` شرط تات به وضوح برای وجود تطابق کامل لازم است. برای اثبات به ازای یک مجموعه :math:`S` داشته باشیم :math:`|S| < O(S)`. در اینصورت برای وجود تطابق کامل باید از هر مولفه فرد که در :math:`O(S)` شمردیم باید یک راس به راسی در :math:`S` مطابق شده باشد. از آنجایی که گفتیم :math:`|S| < O(S)` پس پیدا کردن تطابق کامل امکان پذیر نیست. برای اثبات کافی بودن شرط از اکسترمال استفاده می کنیم. یعنی با استفاده از برهان خلف فرض کنید گراف :math:`G` تطابق کامل ندارد و شرط تات در آن صدق می کند. توجه کنید که با اضافه کردن یال به گراف :math:`G` شرط تات برقرار می ماند‌ (چرا؟). پس ایده کلی ما به این صورت است که تا زمانی که در گرافمان تطابق کامل به وجود نیاید یک یال که در آن حضور ندارد را به آن اضافه خواهیم کرد. در نهایت به گراف ماکسیمال :math:`H` می رسیم که : - شرط تات در آن صدق می کند. - در آن تطابق کامل وجود ندارد. - به ازای هر یال :math:`uv` که در :math:`H` نیست در صورتی که آن را به :math:`H` اضافه کنیم تطابق کامل به وجود خواهد آمد. حالا هدف ما این است که ثابت کنیم گراف :math:`H` همین حالا هم تطابق کامل دارد (در اینصورت با فرض خلف به تناقض می خوریم و مسئله اثبات می شود). ابتدا توجه کنید که برقرار بودن شرط تات به ازای :math:`S = \phi` به ما نتیجه می دهد که :math:`H` دارای هیچ مولفه همبندی با فرد راس نیست در نتیجه تعداد راس های گراف زوج است. - **گلابی** : راس های :math:`a,b,c,d` به طوریکه :math:`ab,ac` یال‌های گراف باشند ولی :math:`bc,ad` یال‌های گراف نباشند. - **سیب** : راس های :math:`a,b,c` به طوریکه :math:`ab,ac` یال‌های گراف باشند ولی :math:`bc` یال‌ گراف نباشد. .. figure:: /_static/sib_golabi.png :width: 50% :align: center :alt: اگه اینترنت یارو آشغال باشه این میاد ادعا می کنیم اگر بتوانیم در :math:`H` یک گلابی پیدا کنیم می توانیم ثابت کنیم در :math:`H` تطابق کامل وجود دارد. پس یک گلابی دلخواه را در نظر بگیرید و راس های آن را :math:`a,b,c,d` مطابق تعریف در نظر بگیرید. اگر به :math:`H` یال :math:`ad` را اضافه کنید در آن تطابق :math:`M1` وجود خواهد داشت که شامل :math:`ad` است. اگر به :math:`H` یال :math:`bc` را اضافه کنید در آن تطابق :math:`M2` وجود خواهد داشت که شامل :math:`bc` است. حالا :math:`M = M1 \Delta M2` را در نظر بگیرید. طبق مطالب گفته شده در قسمت های قبل یال های :math:`M` به صورت تعدادی دور می باشد. اگر یال :math:`ad` و :math:`bc` در دو دور متفاوت باشند‌ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ آنگاه از دوری که :math:`ad` درون آن است یال های :math:`M2` و از دوری که :math:`bc` درون آن است یال های :math:`M1` را انتخاب کنید (از بقیه دور ها به صورت دلخواه یال های :math:`M1` یا :math:`M2` را انتخاب کنید و یال هایی که در :math:`M1 \cap M2` هستند را نیز انتخاب کنید). در اینصورت در :math:`H` یک تطابق کامل خواهیم داشت! اگر یال :math:`ad` و :math:`bc` در یک دور باشند ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ در ابتدا باید بگوییم که این دور زوج است. حالا چون :math:`b,c` یکی از یال های دور است :math:`b,c` دو راس متوالی در دور هستند پس در صورتیکه به ازای دقیقا یکی از یال های :math:`ab` یا :math:`ac` اتفاق زیر می افتد : اگر راس های دو سر یال را از گراف حذف کنیم دور ما تبدیل به دو مسیر زوج راسی خواهد شد. بدون کم شدن از کلیت مسئله فرض کنید این یال :math:`ab` باشد. حالا یال :math:`ab` را برای تطابق انتخاب کنید. و سپس :math:`a,b` را از گراف حذف کنید و یال های دو مسیر زوج راسی به وجود آمده را یکی در میان برای تطابق انتخاب کنید. در اینصورت تمام راس های دور ما توسط یال های انتخاب شده پوشش داده می شوند. مشابه بالا از بقیه دور ها به صورت دلخواه یال های :math:`M1` یا :math:`M2` را انتخاب کنید و یال هایی که در :math:`M1 \cap M2` هستند را نیز انتخاب کنید. در اینصورت در :math:`H` یک تطابق کامل خواهیم داشت! اگر گلابی نداشتیم چه؟ ~~~~~~~~~~~~~~~~~~~~~~~~~ در دو قسمت بالا ثابت کردیم اگر در گراف :math:`H` گلابی داشتیم آنگاه :math:`H` دارای یک تطابق کامل است. حالا باید حالاتی که در :math:`H` گلابی وجود ندارد را هم در نظر بگیریم. مجموعه :math:`C` را شامل تمام راس های :math:`H` در نظر بگیرید که به همه راس های دیگر یال دارند (درجه آن ها :math:`n-1` است). حالا اگر :math:`C` تمام راس های :math:`H` را شامل شود به این معنی است که :math:`H` یک خوشه‌ (و دارای زوج راس) است.پس به وضوح در آن تطابق کامل وجود دارد. پس گراف :math:`W = H-C` را در نظر بگیرید. در :math:`W` به ازای هر راس مثل :math:`u` راسی مثل :math:`v` وجود دارد که بین :math:`uv` یالی نیست (چرا؟). پس اگر بتوانیم در :math:`W` یک سیب پیدا کنیم آنگاه می توانیم یک گلابی هم پیدا کنیم(زیرا تنها کافیست به ازای راس :math:`a` در سیب راس :math:`d` را طوری بیابیم که بین :math:`a,d` یال نباشد). پس اگر در :math:`W` سیب وجود داشته باشد مسئله حل می شود. پس فرض کنید در :math:`W` سیب وجود ندارد. در اینصورت به ازای هر :math:`a,b,c` دلخواه که :math:`ab,ac` یال گراف هستند، :math:`bc` هم باید یال این گراف باشد. یک راس دلخواه مثل :math:`u` را در نظر بگیرید و مجموعه خود :math:`u` و راس های مجاور آن را :math:`A` در نظر بگیرید. بین هر دو راس در :math:`A` باید یال باشد(چرا؟) همچنین هیچ راسی خارج از :math:`A` نیست که به :math:`A` یال داشته باشد(چرا؟). پس می توان نتیجه گرفت که هر مولفه همبندی در :math:`W` یک خوشه است. در هر خوشه راس ها را به صورت دلخواه تطابق دهید. از هر خوشه فرد دقیقا یک راس اضافه می ماند. از آنجایی که به ازای :math:`S = C` شرط تات برقرار است پس می توان تمام راس های اضافه مانده در :math:`W` را به راس های :math:`C` تطابق داد. در نهایت کل راس های اضافه مانده در :math:`C` را (که یک خوشه زوج راسی هستند) را به صورت دلخواه تطابق می دهیم. پس در نهایت یک تطابق کامل در :math:`H` پیدا کردیم. حالت کلی تر تطابق یا k-factor ------------------------------- طبق تعریف یک تطابق کامل در گراف :math:`G` به معنی یک زیرمجموعه از یال های گراف مثل :math:`M` است که در :math:`M` درجه هر راس دقیقا 1 باشد. حالا می خواهیم این تعریف را تعمیم دهیم. فرض کنید :math:`a_1,a_2,...,a_n` داده شده است و ما باید بفهمیم آیا یک زیرمجموعه از یال های گراف مثل :math:`M` وجود دارد که در آن درجه هر راس :math:`u` برابر با :math:`a_u` شود؟ در نگاه اول این مسئله بسیار کلی تر و سخت تر از تطابق است ولی در این بخش می خواهیم آن را با استفاده از تطابق حل کنیم. یک ایده اشتباه ~~~~~~~~~~~~~~~~~~ احتمالا اولین ایده ای که به ذهن می رسد این است که راس :math:`u` را دقیقا :math:`a_u` بار کپی کنیم سپس به ازای هر یال :math:`uv` در :math:`G` بین تمام کپی های :math:`u,v` یال قرار دهیم. سپس بررسی کنیم که در گراف جدید تطابق کامل وجود دارد یا خیر. این ایده بسیار شبیه به آن چیزی است که قبلا در فصل تطابق دوبخشی بررسی کردیم اما یک اشتباه بسیار ریز دارد. مشکل این است که ممکن است همزمان از چند تا از یال های بین :math:`u,v` در تطابق استفاده کنیم و این باعث می شود که از یک یال چند بار استفاده کنیم که مطلوب مسئله نیست. حل درست ~~~~~~~~~~~~~~~~~~~~ فرض کنید :math:`d_u` درجه راس :math:`u` باشد. از گراف :math:`G` گراف :math:`G^{\prime}` را به اینصورت می سازیم : به ازای هر راس :math:`u` یک گراف دوبخشی کامل قرار می دهیم! به صورتی که بخش اول آن دارای :math:`d_u - a_u` راس قرار داشته باشد و در بخش دوم آن :math:`d_u` راس قرار داشته باشد. به گراف دوبخشی متناظر با راس :math:`u` ، :math:`B_u` گوییم. سپس یال های گراف :math:`G` را به ترتیبی دلخواه در نظر بگیرید و متناظر آن را (به صورتی که خواهیم گفت) به گراف :math:`G^{\prime}` اضافه کنید. فرض کنید :math:`i` امین یالی که بررسی می کنیم :math:`uv` باشد و قبل از آن :math:`c1` تا از یال های مجاور :math:`u` و :math:`c2` تا از یال های مجاور :math:`v` را بررسی کرده ایم. حالا متناظر یال :math:`uv` برابر خواهد بود با یالی که بین دو راس زیر است : - راس :math:`c1` ام **بخش دوم** گراف :math:`B_u` - راس :math:`c2` ام **بخش دوم** گراف :math:`B_v` حالا ادعا می کنیم وجود داشتن زیرمجموعه :math:`M` از یال ها که شرط مسئله را برآورده کند معادل است با وجود داشتن یک تطابق کامل در گراف :math:`G^{\prime}`! توجه کنید که در این گراف هر یال در گراف اصلی دقیقا یک یال متناظر دارد پس مشکل قبل (چند بار استفاده کردن از یک یال) پیش نمی آید. اثبات کامل درستی قضیه بالا به عهده خواننده واگذار می شود. .. figure:: /_static/k_factor.png :width: 50% :align: center :alt: اگه اینترنت یارو آشغال باشه این میاد