并查集UFS實現(xiàn)模板

# 不帶權(quán)重的并查集
class UnionFindSet:
    def __init__(self):
        self.father = {} # key: 節(jié)點
    def add(self, x):
        if x not in self.father:
            self.father[x] = None
    # 查詢根節(jié)點的同時進行路徑壓縮
    def findRoot(self, x):
        root = x
        while self.father[root] is not None:
            root = self.father[root]
        # root為當前的根節(jié)點
        # 路徑壓縮
        if x != root:
            original_father = self.father[x]
            root = self.findRoot(original_father)
            self.father[x] = root
        return root
    def union(self, x, y):
        # 此處進行了查找
        root_x, root_y = self.findRoot(x), self.findRoot(y)
        if root_x != root_y:
            self.father[root_x] = root_y
    # 判斷xy是否在一個集合中
    def isConnected(self, x, y):
        root_x ,root_y = self.findRoot(x), self.findRoot(y)
        if root_x != root_y: # 不在一個集合中
            return False
        return True
# 帶權(quán)重的并查集
class UnionFindSet:
    def __init__(self):
        self.father={} # key:節(jié)點,value:father
        self.weights={} # 節(jié)點到父節(jié)點的權(quán)重
    def add(self, x):
        if x not in self.father:
            self.father[x] = None
            self.weights[x] = 1
    # 查詢根節(jié)點的同時進行路徑壓縮并修改權(quán)重,遞歸寫法
    def findRoot2(self, x):
        root = x
        # 順著x往上竄,一直找到x的祖先root
        while self.father[root] is not None:
            root = self.father[root]
        # root為x的根節(jié)點
        # 路徑壓縮并修改權(quán)重:迭代 改為 遞歸
        if x != root:
            # 再順著x往上竄一遍,一邊竄一邊把每個節(jié)點的父節(jié)點改成root
            original_father = self.father[x]
            root = self.findRoot(original_father)# 遞歸的方式往上找
            self.father[x] = root
            self.weights[x] = self.weights[x] * self.weights[original_father]
        return root
    # 迭代寫法
    def findRoot(self, x):
        root = x
        base = 1 # 權(quán)重放大倍數(shù)
        # 順著x往上竄,一直找到x的祖先root
        while self.father[root] is not None:
            root = self.father[root]
            base *= self.weights[root] # 總倍數(shù)
        # root為x的根節(jié)點,路徑壓縮.
        while x != root:
            original_father = self.father[x]
            self.father[x] = root
            self.weights[x] *= base
            # 離根節(jié)點越近继榆,放大倍數(shù)越小滨巴。
            base /= self.weights[original_father]
            x = original_father
        return root

    def union(self, x, y, value):
        # value 為 x/y的值
        # 此處進行了查找,weights已經(jīng)改變了
        root_x, root_y = self.findRoot(x), self.findRoot(y)
        # x,y的根節(jié)點相等前翎,說明不需要合并
        if root_x == root_y:
            return
        # x指向y或者y指向x都行,整個并查集都一致就行
        if root_x != root_y:
            self.father[root_x] = root_y
            """
             這個公式需要推導
             x/y = 2 ==> 2*y/x = 基本單位
             記根節(jié)點為s = 1,也就是root_x
            """
            self.weights[root_x] = self.weights[y] * value / self.weights[x]
    # 判斷x,y是否在一個集合中已维,如果在一個集合中則返回除法的結(jié)果否則返回-1
    def isConnected(self, x, y):
        # 注意此處執(zhí)行了查詢斧蜕,修改了權(quán)重
        root_x ,root_y = self.findRoot(x), self.findRoot(y)
        if root_x != root_y: # 不在一個集合中
            return -1
        return self.weights[x] / self.weights[y]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末号显,一起剝皮案震驚了整個濱河市跨细,隨后出現(xiàn)的幾起案子鹦倚,更是在濱河造成了極大的恐慌,老刑警劉巖冀惭,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件震叙,死亡現(xiàn)場離奇詭異,居然都是意外死亡散休,警方通過查閱死者的電腦和手機媒楼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戚丸,“玉大人划址,你說我怎么就攤上這事∠薷” “怎么了夺颤?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谣殊。 經(jīng)常有香客問我拂共,道長,這世上最難降的妖魔是什么姻几? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮势告,結(jié)果婚禮上蛇捌,老公的妹妹穿的比我還像新娘。我一直安慰自己咱台,他們只是感情好络拌,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著回溺,像睡著了一般春贸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遗遵,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天萍恕,我揣著相機與錄音,去河邊找鬼车要。 笑死允粤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播类垫,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼司光,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了悉患?” 一聲冷哼從身側(cè)響起残家,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎售躁,沒想到半個月后跪削,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡迂求,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年碾盐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揩局。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毫玖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凌盯,到底是詐尸還是另有隱情付枫,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布驰怎,位于F島的核電站阐滩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏县忌。R本人自食惡果不足惜掂榔,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望症杏。 院中可真熱鬧装获,春花似錦、人聲如沸厉颤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逼友。三九已至精肃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帜乞,已是汗流浹背司抱。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挖函,地道東北人状植。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓浊竟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親津畸。 傳聞我的和親對象是個殘疾皇子振定,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容