簡(jiǎn)單圖論算法筆記

深度優(yōu)先搜索

在圖中搜索的一般過程為:

  1. 記錄當(dāng)前結(jié)點(diǎn)被發(fā)現(xiàn)的時(shí)間(discovery time)
  2. 遍歷訪問未被訪問過的子節(jié)點(diǎn)澜汤,并依次進(jìn)行DFS
  3. 記錄當(dāng)前節(jié)點(diǎn)的結(jié)束時(shí)間(finish time)
  4. 遍歷完成

節(jié)點(diǎn)被發(fā)現(xiàn)時(shí)間和遍歷完成時(shí)間都是圖的重要參數(shù)傻丝。

當(dāng)v是u的后代,u.d<v.d<v.f<u.f。

邊的分類

  1. 樹邊 - 前驅(qū)森林中的邊,如果v是因?yàn)樗惴▽?duì)邊(u,v)的搜索首先發(fā)現(xiàn)v,那么(u,v)是一條樹邊
  2. 前向邊 - 指向深度優(yōu)先樹中一個(gè)后代節(jié)點(diǎn)的邊
  3. 后向邊 - 指向深度優(yōu)先樹中一個(gè)祖先節(jié)點(diǎn)的邊
  4. 橫向邊 - 其它所有邊

將沒有遍歷過的點(diǎn)標(biāo)記為白色撤蟆,正在遍歷中的點(diǎn)標(biāo)記為灰色,后代遍歷完成的點(diǎn)標(biāo)記為黑色堂污,那么在對(duì)節(jié)點(diǎn)u的后代v遍歷過程中生成的邊(u,v)家肯,有

  • v為白色,那么邊為樹邊
  • v為灰色盟猖,邊為后向邊
  • v為黑色讨衣,邊為前向邊或橫向邊

在對(duì)無向圖的深度優(yōu)先遍歷中,從來不會(huì)出現(xiàn)橫向邊和前向邊式镐。

拓?fù)渑判?/h1>

以有向無環(huán)圖未被訪問過的點(diǎn)開始反镇,對(duì)其進(jìn)行DFS。節(jié)點(diǎn)拓?fù)湫驗(yàn)樗耐瓿蓵r(shí)間倒序娘汞。拓?fù)湫虿晃ㄒ淮醪瑁cDFS時(shí)遍歷后繼節(jié)點(diǎn)的順序有關(guān)。對(duì)于有環(huán)的圖你弦,拓?fù)湫驘o法確定惊豺。

強(qiáng)連通分量(Strongly Connected Components)

  • 有向圖中可以兩兩互達(dá)的極大點(diǎn)集點(diǎn)構(gòu)成一個(gè)強(qiáng)連通分量
  • 將強(qiáng)連通分量縮點(diǎn)后的圖稱為分量圖,分量圖一定是有向無環(huán)圖

Kosaraju算法

用該算法對(duì)有向圖G求解SCC的過程可以表述如下

  1. 利用DFS(G)計(jì)算出所有節(jié)點(diǎn)的結(jié)束時(shí)間(finish time)
  2. 構(gòu)建G的轉(zhuǎn)置
  3. DFS(G轉(zhuǎn)置)禽作,但是DFS的主循環(huán)中尸昧,對(duì)節(jié)點(diǎn)以結(jié)束時(shí)間遞減序訪問
  4. 上一步中生成的DFS森林每棵樹即為一個(gè)SCC

以下內(nèi)容來自書后習(xí)題

半連通性判別

22.5-7 有向圖G=(V,E)中,如果對(duì)于所有的節(jié)點(diǎn)對(duì)u领迈、v彻磁,從u到v的路徑和從v到u的路徑至少存在一條,那么稱G為半連通的(semiconnected)狸捅。給出一個(gè)有效的算法判別有向圖G是否為半連通圖衷蜓,并分析時(shí)間復(fù)雜度。

引理 有向無環(huán)圖G尘喝,如果是半連通的磁浇,則總是存在一條路徑,經(jīng)過G的所有點(diǎn)朽褪。

  1. 充分性 若上述路徑存在置吓,顯然任意兩節(jié)點(diǎn)都有至少一條路徑連通。
  2. 必要性 對(duì)G進(jìn)行拓?fù)渑判虻拊玫焦?jié)點(diǎn)序列衍锚。考察序列中任意兩相鄰節(jié)點(diǎn)u和v嗤堰,根據(jù)半連通的性質(zhì)戴质,u和v之間存在路徑將它們連起來。因?yàn)閡和v是拓?fù)湫蛑邢噜弮晒?jié)點(diǎn),若u告匠、v不直接相連戈抄,那么可以證明u和v在拓?fù)湫蛑胁幌噜彛芎笞āK評(píng)划鸽、v必須直接相連。現(xiàn)在討論u戚哎、v之間邊的方向裸诽,如果是(v,u)的話,違背拓?fù)渑判虻囊?guī)定型凳,不可能存在崭捍,于是所有邊的方向都相同。所以在該拓?fù)湫蛑兴邢噜弮牲c(diǎn)都有一條邊將它們連接起來啰脚,這些邊構(gòu)成了上述路徑殷蛇。

定理 有向圖G對(duì)應(yīng)的分量圖如果是半連通的,則G也是半連通的橄浓。
證明 由于G對(duì)應(yīng)的分量圖半連通粒梦,所以存在一條路徑經(jīng)過所有的分量。由于分量?jī)?nèi)部任意兩點(diǎn)是互達(dá)的荸实,所以G中存在一條路徑經(jīng)過所有點(diǎn)匀们。于是任意兩點(diǎn)u、v准给,從u到v的路徑和從v到u的路徑至少存在一條泄朴,故G是半連通圖。

算法SEMICONNECTED-GRAPH(G)描述如下

  1. DFS查找G的所有SCC并縮點(diǎn)露氮,構(gòu)建分量圖G1
  2. 對(duì)G1進(jìn)行拓?fù)渑判蜃婊遥玫近c(diǎn)列
  3. 判斷2中點(diǎn)列是否滿足相鄰直接相連的性質(zhì),若滿足則G為半連通圖

時(shí)間復(fù)雜度分析 第1畔规、2步時(shí)間復(fù)雜度均是O(V+E)局扶,3的時(shí)間復(fù)雜度是O(V),故總的時(shí)間復(fù)雜度為O(V+E)叁扫。

銜接點(diǎn)三妈、橋和雙連通分量

此處討論的為“邊雙連通分量”。

22-2 設(shè)G=(V,E)是一個(gè)無向圖莫绣,G的銜接點(diǎn)是G中的一個(gè)節(jié)點(diǎn)畴蒲,刪除該節(jié)點(diǎn)將導(dǎo)致圖不連通。是一條邊对室,刪除該條邊會(huì)使圖不連通模燥。雙連通分量是指一個(gè)最大邊集合狞玛,里面任意兩條邊都處于同一簡(jiǎn)單環(huán)路中。

我們可以用深度優(yōu)先搜索算法來進(jìn)行這三種元素的判別涧窒。設(shè)G_pi=(V,E_pi)是G的深度優(yōu)先樹。定義v.low=min{v.d,w.d:u是v的一個(gè)后代且(u,w)是一條后向邊}

如何在O(E)時(shí)間內(nèi)計(jì)算出u.low
對(duì)G進(jìn)行DFS锭亏,當(dāng)訪問到節(jié)點(diǎn)u時(shí)

  1. 初始化u.low=u.d
  2. 查找u的相鄰節(jié)點(diǎn)纠吴,設(shè)其為v
    1. 若v是未訪問過的節(jié)點(diǎn),則對(duì)v進(jìn)行DFS慧瘤,并用求得的v.low更新u.low
    2. 若v被訪問過且非u戴已,則u.low=min{u.low,v.d}

算法的關(guān)鍵在于——u.low是可以傳遞的,具體地說锅减,就是在G的某個(gè)點(diǎn)集中糖儡,節(jié)點(diǎn)v具有最小的low值的話,它在這個(gè)點(diǎn)集中所有的祖先節(jié)點(diǎn)都會(huì)具有同樣的low值怔匣。通過這種算法握联,最小low值會(huì)被不斷上傳,從而實(shí)現(xiàn)求解每瞒。

如何在O(E)時(shí)間內(nèi)計(jì)算出銜接點(diǎn)
對(duì)G進(jìn)行DFS并更新low值金闽,再檢查所有點(diǎn)。對(duì)于點(diǎn)u剿骨,若存在相鄰點(diǎn)v代芜,使得u.low!=v.low,則u為銜接點(diǎn)浓利。

如何在O(E)時(shí)間內(nèi)計(jì)算出橋
對(duì)G進(jìn)行DFS并更新low值挤庇,再檢查所有邊。對(duì)于邊(u,v)贷掖,當(dāng)u.d<v.low時(shí)嫡秕,(u,v)是橋。(u.d>v.low也可以)

如何在O(E)時(shí)間內(nèi)對(duì)G中所有的邊做上e.bcc的正整數(shù)標(biāo)記苹威,其中e.bcc=f.bcc當(dāng)且僅當(dāng)e和f處于同一雙連通分量中
一種可行的方法:

  1. 對(duì)G進(jìn)行橋的求解淘菩,并標(biāo)記不同的bcc
  2. 再次進(jìn)行DFS,只經(jīng)過非橋邊屠升,且將非橋邊標(biāo)記為同一bcc

可以肯定的是潮改,邊雙連通分量不可能通過公共點(diǎn)連接,所以每次DFS時(shí)訪問的節(jié)點(diǎn)一定屬于同一邊雙連通分量腹暖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汇在,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脏答,更是在濱河造成了極大的恐慌糕殉,老刑警劉巖亩鬼,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異阿蝶,居然都是意外死亡雳锋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門羡洁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玷过,“玉大人,你說我怎么就攤上這事筑煮⌒廖茫” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵真仲,是天一觀的道長(zhǎng)袋马。 經(jīng)常有香客問我,道長(zhǎng)秸应,這世上最難降的妖魔是什么虑凛? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮软啼,結(jié)果婚禮上卧檐,老公的妹妹穿的比我還像新娘。我一直安慰自己焰宣,他們只是感情好霉囚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匕积,像睡著了一般盈罐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闪唆,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天盅粪,我揣著相機(jī)與錄音,去河邊找鬼悄蕾。 笑死票顾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帆调。 我是一名探鬼主播奠骄,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼番刊!你這毒婦竟也來了含鳞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤芹务,失蹤者是張志新(化名)和其女友劉穎蝉绷,沒想到半個(gè)月后鸭廷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熔吗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年辆床,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桅狠。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讼载,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垂攘,到底是詐尸還是另有隱情,我是刑警寧澤淤刃,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布晒他,位于F島的核電站,受9級(jí)特大地震影響逸贾,放射性物質(zhì)發(fā)生泄漏陨仅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一铝侵、第九天 我趴在偏房一處隱蔽的房頂上張望灼伤。 院中可真熱鬧,春花似錦咪鲜、人聲如沸狐赡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颖侄。三九已至,卻和暖如春享郊,著一層夾襖步出監(jiān)牢的瞬間览祖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工炊琉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留展蒂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓苔咪,卻偏偏與公主長(zhǎng)得像锰悼,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子团赏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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