7.7圖的應用:強連通分支

我們關注一下互聯(lián)網(wǎng)相關的非常巨大圖:
由主機通過網(wǎng)線(或無線)連接而形成的圖弥喉;以及由網(wǎng)頁通過超鏈接連接而形成的圖馒疹。


image.png

先看網(wǎng)頁形成的圖
以網(wǎng)頁(URI作為id)為頂點穿肄,網(wǎng)頁內(nèi)包含的超鏈接作為邊凰棉,可以轉換為一個有向圖损拢。



路德學院計算機系網(wǎng)站鏈接情況,有三個有趣的現(xiàn)象
圖中包含了許多路德學院其它系的網(wǎng)站撒犀,包含了一些愛荷華其它大學學院的網(wǎng)站,還包含了一些人文學院的網(wǎng)站

?我們可以猜想掏秩,Web的底層結構可能存在某些同類網(wǎng)站的聚集
?在圖中發(fā)現(xiàn)高度聚集節(jié)點群的算法或舞,即尋找“強連通分支Strongly Connected Components”算法
?強連通分支,定義為圖G的一個子集C蒙幻,C中的任意兩個頂點v,w之間都有路徑來回映凳,即(v,w)(w,v)都是C的路徑,而且C是具有這樣性質(zhì)的最大子集

強連通分支例子
下圖是具有3個強連通分支的9頂點有向圖
一旦找到強連通分支邮破,可以據(jù)此對圖的頂點進行分類诈豌,并對圖進行化簡。


image.png

image.png

強連通分支算法:轉置概念
在用深度優(yōu)先搜索來發(fā)現(xiàn)強連通分支之前抒和,先熟悉一個概念:Transposition轉置一個有向圖G的轉置GT矫渔,定義為將圖G的所有邊的頂點交換次序,如將(v,w)轉換為(w,v)可以觀察到圖和轉置圖在強連通分支的數(shù)量和劃分上摧莽,是相同的庙洼。
強連通分支算法:Kosaraju算法思路
?首先,對圖G調(diào)用DFS算法镊辕,為每個頂點計算“結束時間”油够; ?然后,將圖G進行轉置征懈,得到GT石咬;
?再對GT調(diào)用DFS算法,但在dfs函數(shù)中卖哎,對每個頂點的搜索循環(huán)里鬼悠,要以頂點的“結束時間”倒序的順序來搜索
?最后删性,深度優(yōu)先森林中的每一棵樹就是一個強連通分支


第一趟DFS

轉置后第二趟DFS

結果
from DFSGraph import DFSGraph


class DFSGraphStrongConnect(DFSGraph):
    def __init__(self):
        super().__init__()
        self.time = 0

    def dfs(self):
        for v in self:
            v.setColor('white')
            v.setPred(None)
        lst = list(self.verList.values())
        lst.sort(key=lambda v:-v.finishTime)

        mydict = {}

        for v in lst:
            if v.getColor() == 'white':
                mydict[v.getId()] = []
                self.dfsvisit(v,mydict[v.getId()])

        return mydict

    def dfsvisit(self, startV,path):
        path.append(startV)
        startV.setColor('gray')
        self.time += 1
        startV.discoveryTime = self.time

        for nbr in startV.getConnections():
            if nbr.getColor() == 'white':
                nbr.setPred(startV)
                self.dfsvisit(nbr,path)

        startV.setColor('black')
        self.time += 1
        startV.finishTime = self.time

if __name__ == '__main__':
    g = DFSGraph()
    g.addEdge('A','B')
    g.addEdge('B', 'E')
    g.addEdge('B', 'C')
    g.addEdge('E', 'A')
    g.addEdge('E', 'D')
    g.addEdge('D', 'B')
    g.addEdge('C', 'F')
    g.addEdge('D', 'G')
    g.addEdge('G', 'E')
    g.addEdge('F', 'H')
    g.addEdge('H', 'I')
    g.addEdge('I', 'F')

    g.dfs()
    for node in g:
        print(node,node.discoveryTime,node.finishTime)


    gt = DFSGraphStrongConnect()
    for node in g:
        for nbr in node.connectedTo.keys():
            gt.addEdge(nbr.getId(),node.getId())

            start = gt.getVertex(nbr.getId())
            start.discoveryTime = nbr.discoveryTime
            start.finishTime = nbr.finishTime

            end = gt.getVertex(node.getId())
            end.discoveryTime = node.discoveryTime
            end.finishTime = node.finishTime


    print('-'*70)
    for node in gt:
        print(node,node.discoveryTime,node.finishTime)

    print('-' * 70)
    mydict = gt.dfs()
    for item in mydict.items():
        for node in item[1]:
            print(node.getId(), end=' ')
        print()

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市厦章,隨后出現(xiàn)的幾起案子镇匀,更是在濱河造成了極大的恐慌,老刑警劉巖袜啃,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汗侵,死亡現(xiàn)場離奇詭異,居然都是意外死亡群发,警方通過查閱死者的電腦和手機晰韵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熟妓,“玉大人雪猪,你說我怎么就攤上這事∑鹩” “怎么了只恨?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抬虽。 經(jīng)常有香客問我官觅,道長,這世上最難降的妖魔是什么阐污? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任休涤,我火速辦了婚禮,結果婚禮上笛辟,老公的妹妹穿的比我還像新娘功氨。我一直安慰自己,他們只是感情好手幢,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布捷凄。 她就那樣靜靜地躺著,像睡著了一般弯菊。 火紅的嫁衣襯著肌膚如雪纵势。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天管钳,我揣著相機與錄音钦铁,去河邊找鬼。 笑死才漆,一個胖子當著我的面吹牛牛曹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播醇滥,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼黎比,長吁一口氣:“原來是場噩夢啊……” “哼超营!你這毒婦竟也來了?” 一聲冷哼從身側響起阅虫,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤演闭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后颓帝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體米碰,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年购城,在試婚紗的時候發(fā)現(xiàn)自己被綠了吕座。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘪板,死狀恐怖吴趴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侮攀,我是刑警寧澤锣枝,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站兰英,受9級特大地震影響惊橱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜箭昵,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望回季。 院中可真熱鬧家制,春花似錦、人聲如沸泡一。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼻忠。三九已至涵但,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帖蔓,已是汗流浹背矮瘟。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塑娇,地道東北人澈侠。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像埋酬,于是被迫代替她去往敵國和親哨啃。 傳聞我的和親對象是個殘疾皇子烧栋,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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

  • 1 晚飯后祝峻,因感冒渾身酸痛魔吐,心里很煩躁;偏偏小寶燒也未退呼猪,極其黏我画畅;而爸爸加班一直未歸,奶奶還在收拾廚房宋距。突然轴踱,哥...
    遠9898閱讀 3,820評論 0 2
  • 拆分優(yōu)先級 最小可行性方案兜底 見縫插針的迭代 比如這個業(yè)務需求涉及到某某頁面,就把某某頁面相關的體驗優(yōu)化或創(chuàng)新點...
    春末夏初sdc閱讀 387評論 0 0
  • 西游記的故事,想必大部分朋友是非常熟悉的了壶唤。 今天咱們換個方式雳灵,看圖猜一猜,你能全部猜對嘛闸盔? 你能猜到這是西游記里...
    天蓬小花卷閱讀 435評論 0 7
  • 我特別喜愛歷史悯辙,日月如梭光陰似箭,轉眼來到了2036年迎吵,我當上了歷史系博士躲撰,打算坐穿越機回到歷史中看一眼。 看到了...
    天天向上張同學閱讀 281評論 0 0