Skip to main content

Posts

Showing posts from May 21, 2019

Disjoint Set Union

Disjoint Set Union (Union Find)-н тухай.  Бидэнд анх аль ч хоёр орой нь хоорондоо холбогдоогүй граф байгаа гэж үзье. Өөрөөр хэлбэл нийт N ширхэг компонент байгаа. Нийт Q ширхэг холболт байгаа ба x, y гэсэн хоёр оройг холбох ба энэ бүх холболтын дараа нийт хэдэн ширхэг компонент байгааг олох жишээ бодлого бодоцгооё. par[N], s[N] гэсэн array авж үзье. par[x] нь x оройн эцгийг, s[x] нь энэ оройд хэдэн хүү байгааг хадгална. Анх бүх i-н хувьд par[i] = i, s[i] = 1 байна. Эхлээд find(x) гэсэн функц тодорхойлъё. Энэ нь x гэсэн оройн хамгийн дээд эцэг буюу root оройг буцаана. par[r] == r тохиолдолд энэхүү r орой нь root. Учир нь r оройн эцэг нь өөрөө тул үүнээс дээш орой үгүй. Одоо буцаад x, y хоёр оройг холбох асуудалдаа орцгооё. Холбохын тулд эхлээд бид rootX = find(x), rootY = find(y) гэж олбол x, y гэсэн хоёр оройн тус тусын хамгийн дээд эцгийг олж чадсан гэсэн үг. Хэрвээ энэ хоёр орой нь ижилхэн бол x, y хоёр орой нь аль хэдийн нэг компонентэд байгаа нь тодорхой. Энэ тохиолдолд бид өөр