




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
圖論中搜索算法講座第一頁,共五十七頁,2022年,8月28日圖論中搜索算法和最短路徑算法2第二頁,共五十七頁,2022年,8月28日ReadEuler,readEuler,heisthemasterofusall.
P.-S.deLaplace3第三頁,共五十七頁,2022年,8月28日4第四頁,共五十七頁,2022年,8月28日5第五頁,共五十七頁,2022年,8月28日§1圖_基本概念§2圖的存儲結(jié)構(gòu)
§4最短路徑§3圖的遍歷算法內(nèi)容6第六頁,共五十七頁,2022年,8月28日圖是一種較線性表和樹更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。線性表:
線性結(jié)構(gòu)樹:
層次結(jié)構(gòu)圖:
結(jié)點之間的關(guān)系可以是任意的,即圖中任意兩個數(shù)據(jù)元素之間都可能相關(guān)。如:
ABCDE第一節(jié):圖的基本概念7第七頁,共五十七頁,2022年,8月28日1圖的定義和基本術(shù)語圖G
是由兩個集合—頂點集V(G)
和邊集E(G)
組成的,記作G=(V(G),E(G)),簡稱G=(V,E)。ABCDEABCDEABCDEV是頂點的有窮非空集合
E是兩個頂點之間的關(guān)系,即邊的有窮集合
8第八頁,共五十七頁,2022年,8月28日無向圖和有向圖無向圖:
邊是頂點的無序?qū)?,即邊沒有方向性。v1v2v3v5v4上面無向圖可以表示為:G=(V,E),其中V={v1,v2,v3,v4,v5}E={(v1,v2)
,(v1,v4),(v2,v3),(v2,v5),(v3,v4),(v3,v5)}(v1,v2)表示頂點v1和v2之間的邊,(v1,v2)=(v2,v1)。9第九頁,共五十七頁,2022年,8月28日有向圖:
其邊是頂點的有序?qū)?,即邊有方向性。v1v2v4v3V={v1,v2,v3,v4}E={<v1,v2>
,<v1,v3>,<v3,v4>,<v4,v1>,<v2,v1>}在有向圖中,通常邊稱為弧,<v1,v2>表示頂點v1到v2的弧。稱v1為弧尾,稱v2為弧頭。<v1,v2>≠<v2,v1>上面有向圖可以表示為:G=(V,E),其中10第十頁,共五十七頁,2022年,8月28日帶權(quán)無向圖(無向網(wǎng))和帶權(quán)有向圖(有向網(wǎng))有時對圖的邊或弧賦予相關(guān)的數(shù)值,這種與圖的邊或弧相關(guān)的數(shù)值叫做權(quán)。
這種帶權(quán)的圖通常稱為網(wǎng)。
帶權(quán)的有向圖稱為有向網(wǎng)。帶權(quán)的無向圖稱為無向網(wǎng)。ABCDE53821497這些權(quán)可以表示從一個頂點到另一個頂點的距離??梢员硎緩囊粋€頂點到另一個頂點的耗費。11第十一頁,共五十七頁,2022年,8月28日子圖假設(shè)有兩個圖
G=(V,E)和
G’=(V’,E’),如果
V’V,且
E’E,則稱
G’
為
G
的子圖。
v1v2v4v3求子圖v1v1v3v1v4v3v1v2v4v3v1v2v4v312第十二頁,共五十七頁,2022年,8月28日鄰接與關(guān)聯(lián)對于無向圖
G=(V,E),如果邊
(v,v’)∈E,則稱頂點
v和
v’互為鄰接點,即
v
和
v’
相鄰接。
邊
(v,v’)依附于頂點
v和
v’,或者說
(v,v’)
與頂點
v
和
v’
相關(guān)聯(lián)。
對于有向圖
G=(V,E),如果弧
<v,v’>∈E,則稱頂點
v鄰接到頂點
v’,頂點
v’鄰接自頂點
v。
vv’vv’弧<v,v’>
和頂點v,v’
相關(guān)聯(lián)。13第十三頁,共五十七頁,2022年,8月28日頂點的度對于無向圖,頂點
v的度是和
v相關(guān)聯(lián)的邊的數(shù)目,記做TD(v)。
v1v2v3v5v4頂點v3的度為
3對于有向圖,頂點
v的度
TD(V)分為兩部分——出度、入度。
以頂點
v為頭的弧的數(shù)目稱為
v的入度,記為ID(v)
;以頂點
v為尾的弧的數(shù)目稱為
v的出度,記為OD(v);
頂點
v的度為TD(v)=ID(v)+OD(v)。
14第十四頁,共五十七頁,2022年,8月28日v1v2v4v3頂點v1
的出度為2頂點v1
的入度為1頂點v1
的度為315第十五頁,共五十七頁,2022年,8月28日路徑、鏈、簡單路徑、回路(環(huán))、簡單回路無向圖G中若存在一條有窮非空序列w=v0e1
v1e2
v2
ek
vk
,其中vi和ei分別為頂點和邊,則稱w
是從頂點v0到vk的一條路徑。…頂點v0和vk分別稱為路徑
w
的起點和終點。路徑的長度是路徑上的邊的數(shù)目。v0v1v2vk-1vk...e1e2ek起點和終點相同的路徑稱為回路(環(huán))。16第十六頁,共五十七頁,2022年,8月28日若路徑w的邊e1,e2,,ek
互不相同,則稱w為鏈?!袈窂絯的頂點v0,v1,,vk
互不相同,則稱w為簡單路徑?!璿0v1v2vk-1vk...e1e2ek鏈?zhǔn)欠駷楹唵温窂?簡單路徑是否為鏈?不一定一定e1e2e3e4e5除了第一個頂點和最后一個頂點外,其余頂點不重復(fù)出現(xiàn)的回路稱為簡單回路(簡單環(huán))。17第十七頁,共五十七頁,2022年,8月28日例157324G26路徑:1,2,5,7,6,5,2,3路徑長度:7簡單路徑:1,2,5,7,6回路:1,2,5,7,6,5,2,1簡單回路:1,2,3,118第十八頁,共五十七頁,2022年,8月28日有向圖G中若存在一條有窮非空序列w=v0e1
v1e2
v2
ek
vk
,其中vi和ei分別為頂點和弧,則稱w
是從頂點v0到vk的一條路徑?!璿0v1v2vk-1vk...e1e2ek鏈簡單路徑回路簡單回路19第十九頁,共五十七頁,2022年,8月28日例245136G1路徑:1,2,3,5,6,3路徑長度:5簡單路徑:1,2,3,5回路:1,2,3,5,6,3,1簡單回路:3,5,6,320第二十頁,共五十七頁,2022年,8月28日連通、連通圖無向圖G,如果從頂點
v
到頂點
v’
有路徑,則稱
v
和
v’
是連通的。
如果對于無向圖
G
中任意兩個頂點
vi,vj
∈V,vi和
vj都是連通的,則稱
G是連通圖。
v1v2v3v5v4是否為連通圖21第二十一頁,共五十七頁,2022年,8月28日第2節(jié)圖的存儲結(jié)構(gòu)順序存儲鄰接矩陣鏈?zhǔn)酱鎯︵徑颖磬徑佣嘀乇硎宙湵砣绾伪磉_(dá)頂點之間存在的聯(lián)系?v1v2v4v322第二十二頁,共五十七頁,2022年,8月28日2.1鄰接矩陣設(shè)圖G=(V,E)具有n(n≥1)個頂點v1,v2,,vn
和m
條邊或弧e1,e2,,em
,則G的鄰接矩陣是n×n
階矩陣,記為A(G)
。……其每一個元素aij
定義為:鄰接矩陣存放n
個頂點信息和n2
條邊或弧信息。aij=01頂點vi與vj不相鄰接頂點vi與vj相鄰接v1v2v4v3例有向圖GA(G)=12341234011000000001100023第二十三頁,共五十七頁,2022年,8月28日v1v2v3v5v4例無向圖G0101010101010111010001100A(G)=1234512345優(yōu)點:1.容易判斷任意兩個頂點之間是否有邊或弧。2.容易求取各個頂點的度。24第二十四頁,共五十七頁,2022年,8月28日無向圖,頂點vi
的度是鄰接矩陣中第
i行或第
i列的元素之和。例G中,v1
的度為2。v1v2v3v5v4例無向圖G0101010101010111010001100A(G)=123451234525第二十五頁,共五十七頁,2022年,8月28日v1v2v4v3例有向圖GA(G)=123412340110000000011000有向圖,頂點vi
的出度是鄰接矩陣中第
i行的元素之和。頂點vi
的入度是鄰接矩陣中第
i列的元素之和。例v1
的出度為2;入度為1。26第二十六頁,共五十七頁,2022年,8月28日無向圖的鄰接矩陣都是對稱矩陣。有向圖的鄰接矩陣一般不對稱。12341234011000000001100001010101010101110100011001234512345故無向圖可以采用壓縮存儲方式無向圖有向圖27第二十七頁,共五十七頁,2022年,8月28日帶權(quán)圖(網(wǎng))的鄰接矩陣v1v2v3v5v4v65487935651aij=
wij∞頂點vi與vj相鄰接頂點vi與vj不相鄰接∞5∞7∞∞∞∞4∞∞∞
8∞∞∞∞9∞∞5∞∞6∞∞∞5∞∞A=
123456123456
3∞∞∞1∞28第二十八頁,共五十七頁,2022年,8月28日鄰接矩陣存儲的缺點:這種存貯方式的空間復(fù)雜度正比于圖的結(jié)點個數(shù)的平方,所以,當(dāng)圖中結(jié)點很多但邊卻很少時,采用這種結(jié)構(gòu)會造成很大的浪費。29第二十九頁,共五十七頁,2022年,8月28日2.2鄰接表對圖中每一個頂點建立一個單鏈表,指示與該頂點關(guān)聯(lián)的邊或出弧。vexinfofirstarcadjvexnextarcarcinfo表結(jié)點頭結(jié)點adjvex:鄰接頂點位置arcinfo:邊的信息nextarc
:下一條關(guān)聯(lián)邊結(jié)點vexinfo:頂點的信息firstarc:第一條關(guān)聯(lián)邊結(jié)點v1v2v3v5v4v6548793565130第三十頁,共五十七頁,2022年,8月28日v1v2v3v5v4例無向圖Ge1e2e3e4e5e612345v1v2v3v4v54e22e1∧5e43e31e1∧5e64e52e3∧3e51e2∧3e62e4∧如何獲取頂點的度?頂點vi
的度為第i條鏈表中的結(jié)點數(shù)。需要多少存儲空間?n+2e31第三十一頁,共五十七頁,2022年,8月28日v1v2v4v3例有向圖Ge1e2e3e41234v1v2v3v43e22e1∧∧4e3∧1e4∧32第三十二頁,共五十七頁,2022年,8月28日鄰接矩陣與鄰接表存儲空間求頂點的度求頂點的鄰接頂點鄰接表省一樣一樣判斷兩個頂點是否關(guān)聯(lián)鄰接矩陣方便0101010101010111010001100123451234512345v1v2v3v4v54e22e1∧5e43e31e1∧5e64e52e3∧3e51e2∧3e62e4∧33第三十三頁,共五十七頁,2022年,8月28日3圖的遍歷與樹的遍歷類似,如果從圖中某一頂點出發(fā)訪遍圖中所有頂點,且使每一個頂點僅被訪問一次,這一過程稱為圖的遍歷。圖的遍歷算法是求解圖的連通性問題、拓?fù)渑判蚝颓箨P(guān)鍵路徑等算法的基礎(chǔ)。通常有兩條遍歷圖的路徑:深度優(yōu)先搜索、廣度優(yōu)先搜索。圖的遍歷相對復(fù)雜,為了避免同一個頂點被訪問多次,增設(shè)一個輔助的布爾數(shù)組visited[0..n-1]
指示頂點是否已被訪問過。34第三十四頁,共五十七頁,2022年,8月28日3.1深度優(yōu)先搜索深度優(yōu)先搜索是類似于樹的一種先序遍歷v1v2v3v5v4v6v7v8圖可分為三部分:基結(jié)點第一個鄰接結(jié)點導(dǎo)出的子圖其它鄰接頂點導(dǎo)出的子圖深度優(yōu)先搜索順序:v1v2v4v8v5v3v6v735第三十五頁,共五十七頁,2022年,8月28日1.從圖中某個頂點v
出發(fā),訪問此頂點;2.然后依次從v
的未被訪問的鄰接點出發(fā)進(jìn)行深度優(yōu)先遍歷;3.直至圖中所有和v
有路徑相通的頂點都被訪問到。4.若此時圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點做起始點,重復(fù)上述過程,直至圖中所有頂點都被訪問到。算法描述:36第三十六頁,共五十七頁,2022年,8月28日深度優(yōu)先遍歷算法(DFS)遞歸算法開始訪問V0,置標(biāo)志求V0鄰接點有鄰接點w求下一鄰接點wV0W訪問過結(jié)束NYNYDFS開始標(biāo)志數(shù)組初始化Vi=1Vi訪問過DFSVi=Vi+1Vi==Vexnums結(jié)束NNYY37第三十七頁,共五十七頁,2022年,8月28日visited[v]=TRUE
;printf(v);//訪問此頂點for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))if(!visited[w])DFSTraverse(G,w)
;returnOK;voidDFSTraverse(GraphG,intv){//visited[0..n-1]初始為0;v指示頂點在數(shù)組中的位置;}38第三十八頁,共五十七頁,2022年,8月28日v1v2v3v5v4v6v7v8過程分析v1v2v3v4v6v8v5v7深度優(yōu)先搜索順序:v1v2v4v8v5v3v6v739第三十九頁,共五十七頁,2022年,8月28日棧實現(xiàn)深度優(yōu)先搜索v1v2v3v4v6v8v5v7深度優(yōu)先搜索順序:v1v2v4v8v5v3v6v7v1v2v4v8v5v3v6v7總是從棧頂出發(fā)搜索!40第四十頁,共五十七頁,2022年,8月28日initstack(S);visited[v]=TRUE;Push(S,v)
;printf(v);Gettop(S,v)
;for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))if(!visited[w]){visited[w]=TRUE;Push(S,w);printf(w);Gettop(S,v);}Pop(S)
;while(!StackEmpty(S)){}voidDFSTraverse(GraphG,intv){}41第四十一頁,共五十七頁,2022年,8月28日深度優(yōu)先搜索的C語言實現(xiàn):typedefstructnode{intadjvex;//鄰接點域,存放與Vi鄰接的點在表頭數(shù)組中的位置structnode*next;//鏈域,指示下一條邊或弧}JD;//表頭接點:typedefstructtnode{intvexdata;//存放頂點信息structnode*firstarc;//指示第一個鄰接點}TD;TDga[M];//ga[0]不用v1v2v3v5v4e1e2e3e4e5e642第四十二頁,共五十七頁,2022年,8月28日voidtraver(TDg[],intn){inti;staticintvisited[M];for(i=1;i<=n;i++)visited[i]=0;for(i=1;i<=n;i++)if(visited[i]==0) dfs(g,i,visited);}43第四十三頁,共五十七頁,2022年,8月28日voiddfs(TDg[],intv,intvisited[]){JD*w;inti;printf("%d",v);visited[v]=1;w=g[v].firstarc;while(w!=NULL){i=w->adjvex;if(visited[i]==0) dfs(g,i,visited);w=w->next;}}44第四十四頁,共五十七頁,2022年,8月28日3.2廣度優(yōu)先搜索廣度優(yōu)先搜索類似于樹的層次遍歷,廣度優(yōu)先搜索順序:v1v2v3v4v5v6v7v8v1v2v3v5v4v6v7v8只有父輩結(jié)點被訪問后才會訪問子孫結(jié)點!把圖人為的分層,按層遍歷。45第四十五頁,共五十七頁,2022年,8月28日1.從圖中某個頂點v
出發(fā),訪問此頂點;2.然后依次訪問v
的各個未曾訪問的鄰接點;4.直至圖中所有和v
有路徑相通的頂點都被訪問到。5.若此時圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點做起始點,重復(fù)上述過程,直至圖中所有頂點都被訪問到。3.然后依次從這些鄰接點出發(fā)再依次訪問它們的鄰接點;算法描述:46第四十六頁,共五十七頁,2022年,8月28日v1v2v3v5v4v6v7v8過程分析廣度優(yōu)先搜索順序:v1v2v3v4v6v5v7v8v1v2v3v4v5v6v7v847第四十七頁,共五十七頁,2022年,8月28日廣度優(yōu)先遍歷算法開始標(biāo)志數(shù)組初始化Vi=1Vi訪問過BFSVi=Vi+1Vi==Vexnums結(jié)束NNYY48第四十八頁,共五十七頁,2022年,8月28日開始訪問V0,置標(biāo)志求V鄰接點ww存在嗎V下一鄰接點ww訪問過結(jié)束NYNYBFS初始化隊列V0入隊隊列空嗎隊頭V出隊訪問w,置標(biāo)志w入隊NaaY49第四十九頁,共五十七頁,2022年,8月28日隊列實現(xiàn)廣度優(yōu)先搜索算法InitQueue(Q);visited[v]=TRUE;EnQueue(Q,v)
;printf(v);DeQueue(Q,u);while(!QueueEmpty(Q)){}voidBFSTraverse(GraphG,intv){//visited[0..n-1]初始均為0;v指示頂點在數(shù)組中的位置;}for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))if(!visited[w]){visited[w]=TRUE;EnQueue(Q,w);printf(w);}//其鄰接頂點均送入隊列50第五十頁,共五十七頁,2022年,8月28日4最短路徑ABCGFED旅客希望??空驹缴僭胶?,則應(yīng)選擇A——B——C——G旅客考慮的是旅程越短越好,1120920720210540340640190A——D——E——F——G51第五十一頁,共五十七頁,2022年,8月28日帶權(quán)圖的最短路徑計算問題通常在實際中,航運(yùn)、鐵路、船行都具有有向性,故我們以帶權(quán)有向圖為例介紹最短路徑算法。帶權(quán)無向圖的最短路徑算法也通用。從單個源點到其余各頂點的最短路徑算法。52第五十二頁,共五十七頁,2022年,8月28日4.1從單個源點到其余各頂點的最短路徑算法——Dijkstra算法思想:貪心算法(局部最優(yōu)),按路徑長度遞增的次序產(chǎn)生最短路徑。貪心算法:利用局部最優(yōu)來計算全局最優(yōu)。利用已得到的頂點的最短路徑來計算其它頂點的最短路徑。例,v5v0v1v4v3601005v21030201050求從v0
到其余各頂點的最短路徑。1.初始,D[i]的值為v0
到vi
的弧的權(quán)值D[i]
表示v0
到vi
的最短路徑的長度顯然,D[i]
中的最小值D[2]
便是v0到v2
的最短路徑的長度,Path[2]=(v0,v2)Path[i]表示v0
到vi
的最短路徑53第五十三頁,共五十七頁,2022年,8月28日設(shè)下一條最短路徑的終點是vk
,則這條最短路徑或者是(v0,vk)、或者是v0經(jīng)過v2
或v4到達(dá)vk
的路徑;2.如何尋找下一條最短路徑?例,v5v0v1v4v3601005v21030201050設(shè)下一條最短路徑的終點是vj
,則這條最短路徑或者是(v0,vj)、或者是
v0經(jīng)過v2到達(dá)vj
的路徑;其中取D[i](D[2]除外)
中的最小值得到v4,Path[4]=(v0,v4)。3.如何尋找下一條最短路徑?取D[i](D[2]、D[4]除外)
中的最小值得到v3
,Path[3]=(v0,v4,
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人勞務(wù)雇傭合同范例
- 入伙建房合同范例
- 農(nóng)村宅基地置換合同范例
- app外包項目合同范例
- 偽造修改合同范例
- 個人房屋承建合同范例
- 農(nóng)業(yè)公司采購合同范例
- 公司勞工合同范例
- 全藝人經(jīng)紀(jì)合同范例
- 買賣抵賬房合同范例
- 綜合門診部全科醫(yī)療科設(shè)置基本標(biāo)準(zhǔn)
- GB 15603-1995常用化學(xué)危險品貯存通則
- FZ/T 07019-2021針織印染面料單位產(chǎn)品能源消耗限額
- 北師大版高中英語必修二《New-Zealand-Fact-File》reading-課件-
- 豎彎鉤的書寫課件
- 幼兒園小班植樹節(jié)課件:《栽樹》
- 初中英語《Unit5-Do-you-remember-what-you-were-doing》教學(xué)課件設(shè)計
- 幼兒園大班數(shù)學(xué)口算練習(xí)題可打印
- 小學(xué)班會課件-端午節(jié)主題班會(共19張PPT)通用版 PPT課件
- 細(xì)菌性痢疾流行病學(xué)個案調(diào)查表
- 員工年終述職報告工作總結(jié)PPT模板
評論
0/150
提交評論