圖論的割頂、橋和強(qiáng)連通分量_第1頁
圖論的割頂、橋和強(qiáng)連通分量_第2頁
圖論的割頂、橋和強(qiáng)連通分量_第3頁
圖論的割頂、橋和強(qiáng)連通分量_第4頁
圖論的割頂、橋和強(qiáng)連通分量_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

圖論中的割頂、橋和強(qiáng)連通分量2023/2/52基本概念割點:刪掉它之后(刪掉所有跟它相連的邊),圖必然會分裂成兩個或兩個以上的子圖。

割邊(橋):刪掉一條邊后,圖必然會分裂成兩個或兩個以上的子圖,又稱橋。塊強(qiáng)連通子圖(強(qiáng)連通分量(支,塊))2023/2/53塊及其相關(guān)知識DFS算法割點(一般對于無向圖而言)割邊(一般對于無向圖而言)塊(一般對于無向圖而言)強(qiáng)連通子圖(一般對于有向圖而言)2023/2/54DFS算法PROCEDUREDFS(v);begin inc(sign); dfn[v]:=sign;//給v按照訪問順序的先后標(biāo)號為sign for尋找一個v的相鄰節(jié)點u if邊uv沒有被標(biāo)記過then begin

標(biāo)記邊uv;

給邊定向v→u;

如果u被標(biāo)記過,uv為返祖邊,否則記uv為父子邊

ifu未被標(biāo)記thenDFS(u); end;end;2023/2/55DFS算法父子邊用黑色標(biāo)記,返祖邊用紅色標(biāo)記如下圖,除掉返祖邊之后,我們可以把它看作一棵DFS樹12345672023/2/56割點G是連通圖,v∈V(G),G–v不再連通,則稱v是G的割頂。2023/2/57具體數(shù)據(jù)定義借助兩個輔助數(shù)組dfn[],low[]進(jìn)行DFS便可找到無向圖的割點和割邊,用一個棧st[]維護(hù)記錄塊和“縮點”后連通子圖中所有的點。dfn[i]表示DFS過程中到達(dá)點i的時間,low[i]表示能通過其他邊回到其祖先的最早時間。low[i]=min(low[i],dfn[son[i]])2023/2/58求割點的算法下圖所示,每個點左邊是dfn值,右邊是low值。(經(jīng)過返祖邊后則停止)1.12.13.24.25.26.17.72023/2/59三個定理定理1:DFS中,e=ab是返祖邊,那么要么a是b的祖先,要么a是b的后代子孫。定理2:DFS中,e=uv是父子邊,且dfn[u]>1,low[v]≥dfn[u],則u是割點。定理3:DFS的根r是割點的充要條件是:至少有2條以r為尾(從r出發(fā))的父子邊證明?證明?證明?2023/2/510具體證明設(shè)v,u之間有邊w(v,u),從v->u:

如果low[u]>=dfn[v],說明v的兒子u不能通過其他邊到達(dá)v的祖先,此時如果拿掉v,則必定把v的祖先和v的兒子u,及它的子孫分開,于是v便是一個割點,v和它的子孫形成一個塊。2023/2/511程序代碼PROCEDUREDFS(v);begin inc(sign);dfn[v]:=sign;//給v按照訪問順序的先后標(biāo)號為sign low[v]:=sign;//給lowlink[v]賦初始值

for尋找一個v的相鄰節(jié)點u if邊uv沒有被標(biāo)記過then begin

標(biāo)記邊uv;

給邊定向v→u; ifu未被標(biāo)記過then begin DFS(u);//uv是父子邊,遞歸訪問

low[v]:=min(low[v],low[u]);

iflow[u]>=dfn[v]thenv是割點

end else low[v]:=min(low[v],dfn[u]);//uv是返祖邊

end;end;2023/2/512割邊G是連通圖,e∈E(G),G–e不再連通,則稱e是G的割邊,亦稱做橋。

2023/2/513求割邊的算法與割點類似的,我們定義low和dfn。父子邊e=u→v,當(dāng)且僅當(dāng)low[v]>dfn[u]的時候,e是割邊。我們可以根據(jù)割點算法的證明類似的證明割邊算法的正確性。2023/2/514程序代碼PROCEDUREDFS(v);begin inc(sign);dfn[v]:=sign;//給v按照訪問順序的先后標(biāo)號為sign low[v]:=sign;//給low[v]賦初始值

for尋找一個v的相鄰節(jié)點u if邊uv沒有被標(biāo)記過then begin

標(biāo)記邊uv;

給邊定向v→u; ifu未被標(biāo)記過then begin DFS(u);//uv是父子邊,遞歸訪問

low[v]:=min(low[v],low[u]);

iflow[u]>dfn[v]thenvu是割邊

end else low[v]:=min(low[v],dfn[u]);//uv是返祖邊

end;end;2023/2/515割點與割邊猜想:兩個割點之間的邊是否是割邊?割邊的兩個端點是否是割點?都錯!2023/2/516嗅探器(1)在無向圖中尋找出所有的滿足下面條件的點:割掉這個點之后,能夠使得一開始給定的兩個點a和b不連通,割掉的點不能是a或者b。(ZJOI2004)ab2023/2/517嗅探器(2)數(shù)據(jù)范圍約定結(jié)點個數(shù)N≤100邊數(shù)M≤N*(N-1)/22023/2/518嗅探器(3)樸素算法:枚舉每個點,刪除它,然后判斷a和b是否連通,時間復(fù)雜度O(NM)如果數(shù)據(jù)范圍擴(kuò)大,該算法就失敗了!2023/2/519嗅探器(4)題目要求的點一定是圖中的割點,但是圖中的割點不一定題目要求的點。如上圖中的藍(lán)色點,它雖然是圖中的割點,但是割掉它之后卻不能使a和b不連通由于a點肯定不是我們所求的點,所以可以以a為根開始DFS遍歷整張圖。對于生成的DFS樹,如果點v是割點,如果以他為根的子樹中存在點b,那么該點是問題所求的點。2023/2/520嗅探器(5)時間復(fù)雜度是O(M)的如圖,藍(lán)色的點表示問題的答案,黃色的點雖然是圖的割點,但卻不是問題要求的答案ab2023/2/521關(guān)鍵網(wǎng)線(1)無向連通圖中,某些點具有A屬性,某些點具有B屬性。請問哪些邊割掉之后能夠使得某個連通區(qū)域內(nèi)沒有A屬性的點或者沒有B屬性的點。(CEOI2005)數(shù)據(jù)范圍約定結(jié)點個數(shù)N≤100000邊數(shù)M≤10000002023/2/522關(guān)鍵網(wǎng)線(2)樸素算法:枚舉每條邊,刪除它,然后判斷是否有獨立出來的連通區(qū)域內(nèi)沒有A屬性或者沒有B屬性。復(fù)雜度O(M2)當(dāng)然,這個復(fù)雜度太大了!2023/2/523關(guān)鍵網(wǎng)線(3)正如嗅探器一樣,題目要求的邊一定是原圖中的割邊,但是原圖中的割邊卻不一定是題目中要求的邊。設(shè)A種屬性總共有SUMA個,B中屬性總共有SUMB個。和嗅探器類似的,如果邊e=u→v是割邊,且以v為根的子樹中,A種屬性的數(shù)目為0或者為SUMA,或者B種屬性的數(shù)目為0或者為SUMB,那么e就是題目要求的邊。2023/2/524關(guān)鍵網(wǎng)線(4)下圖中,藍(lán)色的邊表示題目要求的邊,黃色的邊表示雖然是圖中的割邊,但不是題目要求的邊。ABAAAAAAABB2023/2/525塊沒有割點的圖叫2-連通圖,亦稱做塊,G中成塊的極大子圖叫做G的塊。把每個塊收縮成一個點,就得到一棵樹,它的邊就是橋。2023/2/526求塊的算法在求割點的算法中,當(dāng)結(jié)點u的所有鄰邊都被訪問過之后,如果lowlink[u]=dfn[u],我們把u下方的整塊和u導(dǎo)出作為圖中的一個塊。這里需要用一個棧來表示哪些元素是u代表的塊。2023/2/527程序代碼PROCEDUREDFS(v);begin inc(sign);dfn[v]:=sign;//給v按照訪問順序的先后標(biāo)號為sign lowlink[v]:=sign;//給lowlink[v]賦初始值

inc(tot);stack[tot]:=v;//v點進(jìn)棧

for尋找一個v的相鄰節(jié)點u if邊uv沒有被標(biāo)記過then begin

標(biāo)記邊uv;

給邊定向v→u; ifu未被標(biāo)記過then begin DFS(u);//uv是父子邊,遞歸訪問2023/2/528程序代碼 lowlink[v]:=min(lowlink[v],lowlink[u]); end else lowlink[v]:=min(lowlink[v],dfn[u]);//uv是返祖邊

end; iflowlink[v]=dfn[v]then begin

塊數(shù)目number+1; repeat

標(biāo)記stack[tot]這個點為number; dec(tot);//點出棧

untilstack[tot+1]=v; end;end;2023/2/529新修公路(1)給出一張簡單無向圖,問最少添加幾條邊能夠使得原圖中沒有割邊。(CEOI2000)數(shù)據(jù)范圍約定結(jié)點個數(shù)N≤2500邊數(shù)M≤200002023/2/530新修公路(2)為了簡化數(shù)據(jù)關(guān)系,我們先將原圖收縮,變成一棵樹,容易知道的是,剩下的任務(wù)就是添最少的邊,使得樹成為一個塊。(樹中的兩個結(jié)點之間連邊相當(dāng)于原圖中兩個塊中分別任意取點連在一起)猜想:每添一條邊,就選擇樹中的兩個葉子結(jié)點,將它們連起來,于是最少的添邊數(shù)目就是(葉子結(jié)點個數(shù)+1)/22023/2/531新修公路(3)如圖所示,點代表了原圖中的一個塊,它們之間的連邊是割邊。連接a與c,b與d之后,圖中就沒有割邊了。abcd2023/2/532新修公路(4)但并不是任意連接兩個葉子結(jié)點就可以達(dá)到目標(biāo)。假如連接了a與b,c與d,原圖并沒有變成一個塊。abcd2023/2/533新修公路(5)進(jìn)一步分析剛才的算法,每次連接兩個葉子結(jié)點之后,把新生成的圈壓縮成為一個點,以前和圈上的點關(guān)聯(lián)的點,都和新生成的這個“壓縮點”相關(guān)聯(lián)。于是原來的樹在添加一條邊之后,又變回了一棵樹。2023/2/534新修公路(6)在連接a與c之后,新生成的樹只剩下2個葉子結(jié)點;連接b與d之后,樹就被壓縮成了一個點。abcdbd2023/2/535新修公路(7)而如果先連接a與b,那么新生成的樹會剩下3個葉子結(jié)點,連接c與d之后,樹中還剩2個葉子結(jié)點,所以這種連接方法還需要多連一條邊?,F(xiàn)在的問題是,是否一定能找出這樣子的兩個葉子結(jié)點,使得壓縮成的點不會成為新的葉子節(jié)點呢?2023/2/536新修公路(8)連接的兩個點的那條樹中的唯一路徑上,如果除了它們的最近公共祖先到自己的父親有連邊以外,其他的結(jié)點沒有別的分叉,那么連接這兩個點之后縮圈得到的點將會是一個葉子結(jié)點。假設(shè)圖中的任意兩個葉子連接之后,都會多產(chǎn)生一個葉子結(jié)點。當(dāng)圖中的葉子結(jié)點是2個或者3個的時候,怎么連都沒有區(qū)別。2023/2/537新修公路(9)當(dāng)圖中的葉子結(jié)點有4個的時候,a和b到它們的最近公共祖先都沒有別的分叉,且c和d到它們的最近公共祖先沒有別的分叉,可以知道,a和c到它們的最近公共祖先上一定有分叉。這個與假設(shè)矛盾。所以我們總能找到兩個葉子結(jié)點,使得它們連邊之后縮成的樹不會新產(chǎn)生葉子結(jié)點。2023/2/538新修公路(10)具體實現(xiàn):首先一個問題是會碰到圖的壓縮,一個簡單易行的方法是,新建一棵樹來表示壓縮過之后的圖。接著還會碰到一個縮圈的問題,怎么實現(xiàn)這一個環(huán)節(jié)?是否需要重新建樹?可以采取標(biāo)號法,當(dāng)縮一個圈的時候,在圈上取一個代表點,并把其他的點都標(biāo)記為該代表點。一個潛在的問題是,壓縮成的點可能還會被再次壓縮,那么標(biāo)記的時候就比較麻煩了。所以這里可以用并查集來實現(xiàn)標(biāo)號這一步。2023/2/539新修公路(11)算法流程:(1)求出圖中的所有塊,建立一棵代表樹(2)挑出2個葉子結(jié)點,使得連接他們之間的唯一路徑上的分叉數(shù)目最多(3)連接這兩個葉子結(jié)點,并壓縮新生成的圈,得到一棵新的樹(4)如果樹中剩下一個葉子結(jié)點和一個根結(jié)點,直接連接它們,算法結(jié)束;如果樹已經(jīng)成為一個點,算法結(jié)束,否則轉(zhuǎn)(2)2023/2/540有向圖的DFS有向圖的DFS與無向圖的DFS的區(qū)別在于搜索只能順邊的方向進(jìn)行,所以有向圖的DFS不止一個根,因為從某個結(jié)點開始不一定就能走完所有的點。另外,有向圖的DFS除了產(chǎn)生父子邊和返祖邊以外,還會有橫叉邊。我們這樣定義它:u和v在已形成的DFS森林中沒有直系上下關(guān)系,并且有dfn[v]>dfn[u],則稱e=uv是橫叉邊。注意,沒有dfn[v]<dfn[u]這種橫叉邊。2023/2/541連通與強(qiáng)連通圖定義:將所有有向邊改為無向邊,如果該無向圖是連通的,那么原有向圖也稱之為連通圖。對于圖中的任意兩個點A和B,同時存在一條從A到B的路徑和一條從B到A的路徑,則稱該圖為強(qiáng)連通圖。對于一個連通的無向圖,他是一個強(qiáng)連通圖,這里著重介紹一下有向圖的強(qiáng)連通子圖,也稱做強(qiáng)連通分量,強(qiáng)連通分支和強(qiáng)連通分塊。2023/2/542求強(qiáng)連通子圖的另類算法可以知道,圈上的點都是滿足強(qiáng)連通性質(zhì)的,所以我們可以不斷的找圈,然后壓縮它,直到找不到圈為止。該算法因為時間復(fù)雜度過大,本身沒有什么實質(zhì)的作用,但是會給我們的解題思路和算法證明帶來一定的幫助。2023/2/543求強(qiáng)連通子圖的算法1一種求有向圖強(qiáng)連通子圖的算法和求無向圖塊的方法幾乎一樣,不同的是,我們需要特殊考慮一下橫叉邊的處理。如果e=u→v是橫叉邊,那么lowlink[u]:=min(lowlink[u],dfn[v])這一步就無需再做。2023/2/544程序代碼PROCEDUREDFS(v);begin inc(sign);dfn[v]:=sign;//給v按照訪問順序的先后標(biāo)號為sign lowlink[v]:=sign;//給lowlink[v]賦初始值

inc(tot);stack[tot]:=v;//v點進(jìn)棧

instack[v]:=true;//這個用來判斷橫叉邊

for尋找一個v的相鄰節(jié)點u if邊uv沒有被標(biāo)記過then begin

標(biāo)記邊uv;

給邊定向v→u; ifu未被標(biāo)記過then begin DFS(u);//uv是父子邊,遞歸訪問

lowlink[v]:=min(lowlink[v],lowlink[u]); end2023/2/545程序代碼 else

ifinstack[u]then lowlink[v]:=min(lowlink[v],dfn[u]);//uv是返祖邊

end; iflowlink[v]=dfn[v]then begin

塊數(shù)目number+1; repeat

標(biāo)記stack[tot]這個點為number;

instack[stack[tot]]:=false; dec(tot);//點出棧

untilstack[tot+1]=v; end;end;2023/2/546求強(qiáng)連通子圖的算法2基于兩次DFS的有向圖強(qiáng)連通子圖算法(1)對圖進(jìn)行DFS遍歷,遍歷中記下所有的dfn[v]的值。遍歷的結(jié)果是構(gòu)造了一座森林W1;(2)改變圖G中的每一條邊的方向,構(gòu)造出新的有向圖Gr;(3)按照dfn[v]由大到小的順序?qū)r進(jìn)行DFS遍歷。遍歷的結(jié)果是構(gòu)造了新的森林W2,W2中的每棵樹上的頂點構(gòu)成了有向圖的極大強(qiáng)連通子圖。算法證明?2023/2/547有向圖的壓縮將有向圖中的強(qiáng)連通子圖都壓縮成為一個點之后,是否和無向圖壓縮之后的結(jié)果一樣呢?有向圖壓縮之后,連接不同結(jié)點之間的邊有兩種:父子邊,橫叉邊。壓縮后的圖,不是一個標(biāo)準(zhǔn)意義上的樹(將邊看作無向)。它是一個無有向圈的有向圖,即不可再壓縮的圖。有向圖壓縮的意義,在后面的例題《受歡迎的奶?!分形覀儠吹?。2023/2/548探索第二部(1)A和B兩位偵探要合力解決一起謀殺案?,F(xiàn)在有N條線索,單獨的解決一些線索A和B花費的時間是有差別的。而在解決掉某些線索之后,可以毫不費力的解決掉另外一些線索?,F(xiàn)在你的任務(wù)是求出A和B一起配合解決掉所有線索所需要花費的總時間。數(shù)據(jù)范圍約定:線索數(shù)目N≤1000解決每條線索A和B花費的時間ai和bi都不超過152023/2/549探索第二部(2)如果解決了線索x順邊就能解決線索y,那么在x和y之間連一條有向邊??芍?,如果解決了x之后能解決y,解決y之后能解決z,那么說明,我們只需要解決掉x,就能解決y和z。一個顯而易見的性質(zhì):如果x能通過有向邊到達(dá)y,y不能通過有向邊到達(dá)x,那么無論如何,y都不必解決。2023/2/550探索第二部(3)而如果存在x和y能互達(dá),那么從中任意挑出一個來解決就可以。也就是說,在一個強(qiáng)連通子圖內(nèi),我們只需要任意挑出一個線索將它解決,就能解決掉該子圖內(nèi)所有的線索?,F(xiàn)在的任務(wù)便成了,挑出所有的必須被解決線索。然后分配A和B去解決他們。這個問題,我們可以用動態(tài)規(guī)劃來解決。2023/2/551探索第二部(4)那么如何處理一個強(qiáng)連通子圖的情況呢?如果讓A來解決掉一個線索,那么肯定挑出A花費時間最少的那條線索;同理如果B來解決掉一個線索,那么肯定挑出B花費時間最少的那條線索。于是可以將整個子圖壓縮成為一個點,A解決它所需要的時間是所有點中ai的最小值,B解決它所需要的時間是所有點中bi的最小值。2023/2/552探索第二部(5)算法流程:(1)根據(jù)輸入建圖(2)求出途中的所有強(qiáng)連通子圖,并壓縮成一個點(3)挑出森林中所有的根結(jié)點,這些是必須被解決的線索(4)用動態(tài)規(guī)劃算法解決最小總花費的問題2023/2/553受歡迎的奶牛(1)N頭奶牛,給出若干個歡迎關(guān)系A(chǔ)B,表示A歡迎B,歡迎關(guān)系是單向的,但是是可以傳遞的。另外每個奶牛都是歡迎他自己的。求出被所有的奶牛歡迎的奶牛的數(shù)目。(USACOFALL03)數(shù)據(jù)范圍約定:奶牛數(shù)目N≤10000直接的歡迎關(guān)系數(shù)目M≤500002023/2/554受歡迎的奶牛(2)可以想到的是,如果圖中包含有強(qiáng)連通子圖,那么就可以把這個強(qiáng)連通縮成一個點,因為強(qiáng)連通子圖中的任意兩個點可以到達(dá),強(qiáng)連通子圖中所有的點具有相同的性質(zhì),即它們分別能到達(dá)的點集都是相同的,能夠到達(dá)它們的點集也是相同的。通過大膽猜想,我們得到一個結(jié)論:問題的解集是壓縮后的圖中,唯一的那個出度為0的點。2023/2/555受歡迎的奶牛(3)首先,如果該圖不是一張連通圖,那么問題肯定是無解的。在假定圖是一張連通圖的情況下,我們需要證明如下一些東西:(1)解集為什么一定構(gòu)成一個強(qiáng)連通子圖?(2)同時存在2個出度為0的獨立的強(qiáng)連通子圖的時侯,為什么就一定無解?(3)只有一個出度為0的強(qiáng)連通子圖的時候,為什么該強(qiáng)連通子圖一定是問題的解集?(4)如果一個強(qiáng)連通子圖的出度不為0,為什么就一定不是問題的解集?2023/2/556受歡迎的奶牛(4)(1)解集為什么一定構(gòu)成一個強(qiáng)連通子圖?證明:假設(shè)A和B都是最受歡迎的cow,那么,A歡迎B,而且B歡迎A,于是,A和B是屬于同一個強(qiáng)連通子圖內(nèi)的點,所以,問題的解集構(gòu)成一個強(qiáng)連通子圖。2023/2/557受歡迎的奶牛(5)(2)同時存在2個出度為0的獨立的強(qiáng)連通子圖的時侯,為什么就一定無解?證明:如果存在兩個獨立的強(qiáng)連通分量a和b,那么a內(nèi)的點和b內(nèi)的點一定不能互相到達(dá),那么,無論是a還是b都不是解集的那個連通分量,問題保證無解。2023/2/558受歡迎的奶牛(6)(3)只有一個出度為0的強(qiáng)連通子圖的時候,為什么該強(qiáng)連通子圖一定是問題的解集?證明:假設(shè)在壓縮過的圖中,存在結(jié)點A,它到出度為0的結(jié)點(設(shè)為Root)沒有通路,因為A的出度一定不為0,那么設(shè)他可以到B,于是B到Root沒有通路,因為B的出度也一定不為0,那么設(shè)他可以到C……,如此繼續(xù)下去,因為該圖已經(jīng)不可再壓縮,所以這樣下去不會出現(xiàn)已經(jīng)考慮過的點(否則就存在有向環(huán)),那么這樣下去之后,所有的點都到Root沒有通路,而Root到其他所有的點也是沒有通路的,因為它的出度為0,所以Root與其他所有的點是獨立的,這與大前提“該圖是連通圖”矛盾。所以假設(shè)不成立。2023/2/559受歡迎的奶牛(7)(4)如果一個強(qiáng)連通子圖的出度不為0,為什么就一定不是問題的解集?證明:如果某個強(qiáng)連通子圖內(nèi)的點A到強(qiáng)連通分量外的點B有通路,因為B和A不是同一個強(qiáng)連通子圖內(nèi)的點,所以B到A一定沒有通路,那么A不被B歡迎,于是A所在的強(qiáng)連通子圖一定不是解集的那個強(qiáng)連通子圖。2023/2/560受歡迎的奶牛(8)算法流程:(1)壓縮有向圖(2)判斷連通性,并找到圖中出度為0的點的個數(shù)。(3)如果圖不連通或者出度為0的點的個數(shù)超過1,輸出無解,否則轉(zhuǎn)(4)(4)輸出出度為0的點代表的強(qiáng)連通子圖上的點2023/2/561科學(xué)是在不斷的大膽猜想與小心求證中進(jìn)步的!Thankyouforlistening!2023/2/563參考文獻(xiàn)王樹禾《離散數(shù)學(xué)引論》劉汝佳/黃亮《算法藝術(shù)與信息學(xué)競賽》吳文虎/王建德《圖論的算法與程序設(shè)計》2023/2/564MST另類算法證明我們通過kruskal算法的正確性來證明該算法的正確性設(shè)該算法得到的MST’為T’,它不是原圖的最小生成樹T,則存在一條邊e,有e∈T’且e∈T。由于T’不可再調(diào)整,所以在T’中添加e之后,e是所成環(huán)上的最大邊。因而在做kruskal算法時候,該環(huán)上的所有邊在e之前都會被事先考慮是否加入MST中,而在考慮是否加入e這條邊的時候,該環(huán)上的所有點都已經(jīng)連通了,所以e一定不會被加入MST中。推出矛盾。2023/2/565最小環(huán)改進(jìn)算法的證明一個環(huán)中的最大結(jié)點為k(編號最大),與他相連的兩個點為i,j,這個環(huán)的最短長度為g[i][k]+g[k][j]+i到j(luò)的路徑中,所有結(jié)點編號都小于k的最短路徑長度根據(jù)floyd的原理,在最外層循環(huán)做了k-1次之后,dist[i][j]則代表了i到j(luò)的路徑中,所有結(jié)點編號都小于k的最短路徑綜上所述,該算法一定能找到圖中最小環(huán)2023/2/566定理1的證明設(shè)dfn[a]<dfn[b],在DFS的活動中心,即算法中的v,只沿父子邊移動。若a不是b的祖先,但由dfn[a]<dfn[b]可知,a比b先“生”,即

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論