الگوریتم کراسکال
در نظریه گراف، الگوریتم کراسکال الگوریتمی برای یافتن یک زیرگراف فراگیر همبند با کمترین وزن در یک گراف وزندار است (در یک گراف وزن دار، به هر یال وزنی نسبت داده شدهاست). همچنین این الگوریتم برای یافتن کوچکترین درخت فراگیر در یک گراف وزن دار استفاده میشود.
رده | درخت پوشای کمینه |
---|---|
ساختمان داده | مجموعههای مجزا (ساختمان داده) |
کارایی متوسط | |
پیچیدگی فضایی |
به عنوان مثال فرض کنید یک شبکه راه آهن که تعدادی شهر را به یکدیگر متصل میکند در دست احداث است میخواهیم با داشتن هزینه
فرض کنید وزنها نامنفی هستند بنابراین میتوانیم تصور کنیم که زیر گراف فراگیر با کمترین وزن یک درخت فراگیر
الگوریتم کراسکال
- یال پیوندیرا طوری انتخاب کن که وزن آن کوچکترین مقدار موجود باشد.
- اگر یالهای انتخاب شدهاند یالرا از میانبه گونهای انتخاب کن که:
- زیرگراف با یالهای بدون دور باشد.
- از میان یالهای مشمول شرط (الف) وزن دارای کمترین مقدار ممکن باشد.
- زیرگراف با یالهای
- در صورتی که مرحله ۲ دیگر قابل اجرا نیست توقف کن.
برنامهٔ Graph Explorer
نمونهای از خروجی برنامه:
مثال
اثبات
ثابت میکنیم هر درخت فراگیر
از طریق تناقض: به ازای هر درخت فراگیر
ولی در الگوریتم کراسکال
پس
پس
که این با
شبه کد الگوریتم کراسکال
مسئله:یک درخت پوشای می نیمم مشخص کنید.
ورودی:عدد صحیح n>=۲، عدد صحیح مثبت m و یک گراف بدون جهت و وزن دار و متصل شامل n گره و m یال. گراف با یک مجموعه E که شامل یالهای گراف همراه با وزنهای آنها است نشان داده میشود
خروجی:مجموعهای از یالها F در یک درخت پوشا مینیمم
* Void kruskal (int n , int m , * set _of_edges E, * set_of_edges & F) * { * index i, j; * Set_pointer p , q ; * edge e; * Sort the m edges in E by weight in nondecreasing order ; * F=∅; * initial(n); //زیر مجموعه غیر الحاقی n مقدار دهی * While(number of edges in F is less than n-1){ * e= edge with least weight not yet considered; * i, j = indices of vertices connected by e ; * p=find(i); * q=find(j); * if(!equal(p,q)){ * merge(p,q); * add e to F ; * } * } * }
هرگاه n-1 یال در F وجود داشته باشد، از حلقه whileخارج میشویم؛ زیرا در اینصورت، n-1 یال در یک درخت پوشا وجود خواهد داشت
void sort(struct krus ed[],int m) { struct krus temp; for (int i=۰;i<m;i++) for (int j=i+1;j<m;j++) if (ed[j].weight<ed[i].weight) { temp=ed[i]; ed[i]=ed[j]; ed[j]=temp; } }
منابع
- نظریه گرافها و کاربردهای آن، جی.ای. باندی و یو.اس.ار. مورتی. مترجم حمید ضرابی زاده، مؤسسه فرهنگی دیباگران تهران، ۱۳۷۸
- http://en.wikipedia.org/wiki/Kruskal_algorithm