




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
解決圖的編程問題第1頁,共48頁,2023年,2月20日,星期四目標(biāo)在本章中,你將學(xué)到:在圖中存儲數(shù)據(jù)
圖的深度優(yōu)先搜索和廣度優(yōu)先搜索算法最小生成樹圖的最短路徑
第2頁,共48頁,2023年,2月20日,星期四學(xué)習(xí)情境——用圖高速公路交通網(wǎng)的編程[問題描述]
一個地區(qū)由許多城市組成,為實現(xiàn)城市間的高速運(yùn)輸,需要在這些城市間鋪設(shè)高速公路,以達(dá)到任意兩個城市間高速運(yùn)輸?shù)哪康?。?jīng)過考察和預(yù)算,鋪設(shè)的高速公路交通網(wǎng)如圖9.1所示。其中每個頂點(diǎn)代表一個城市,頂點(diǎn)間的連線代表兩個城市間鋪設(shè)的高速公路,而線上的數(shù)字表示兩個城市間的距離(單位:公理)。如圖所示。請根據(jù)上面的描述,解決下面的問題:
用C#編寫一程序來存儲該高速公路交通網(wǎng)的信息。從任何一個城市出發(fā),訪問所有的城市,給出訪問城市的順序。如果想從一個城市到另一個城市旅行,給出最短的旅行路線。第3頁,共48頁,2023年,2月20日,星期四
圖是一系列頂點(diǎn)(結(jié)點(diǎn))和描述頂點(diǎn)之間的關(guān)系邊(?。┙M成。圖是數(shù)據(jù)元素的集合,這些數(shù)據(jù)元素被相互連接以形成網(wǎng)絡(luò)。其形式化定義為:
G=(V,E)
V={Vi|Vi∈某個數(shù)據(jù)元素集合}E={(Vi,Vj)|Vi,Vj∈V∧P(Vi,Vj)}認(rèn)識圖——圖的定義和術(shù)語1.圖的定義其中,G表示圖,V是頂點(diǎn)的集合,E是邊或弧的集合。在集合E中,P(Vi,Vj)表示頂點(diǎn)Vi和頂點(diǎn)Vj之間有邊或弧相連。第4頁,共48頁,2023年,2月20日,星期四認(rèn)識圖——圖的定義和術(shù)語2.圖的術(shù)語頂點(diǎn)集:圖中具有相同特性的數(shù)據(jù)元素的集合稱為頂點(diǎn)集邊(弧):邊是一對頂點(diǎn)間的路徑,通常帶箭頭的邊稱為弧弧頭:每條箭頭線的頭頂點(diǎn)表示構(gòu)成弧的有序?qū)χ械暮笠粋€弧尾:每條箭頭線的尾頂點(diǎn)表示構(gòu)成弧的有序?qū)χ械那耙粋€頂點(diǎn),稱為弧尾或始點(diǎn)。度:在無向圖中的頂點(diǎn)的度是指連那個頂點(diǎn)的邊的數(shù)量。在有向圖中,每個頂點(diǎn)有兩種類的的度:出度和入度。入度:頂點(diǎn)的入度是指向那個頂點(diǎn)的邊的數(shù)量。出度:頂點(diǎn)的出度是由那個頂點(diǎn)出發(fā)的邊的數(shù)量。權(quán):有些圖的邊(或弧)附帶有一些數(shù)據(jù)信息,這些數(shù)據(jù)信息稱為邊(或?。┑臋?quán)(weigh).第5頁,共48頁,2023年,2月20日,星期四認(rèn)識圖——圖的定義和術(shù)語3.圖的分類有向圖:在一個圖中,如果任意兩頂點(diǎn)構(gòu)成的偶對(Vi,Vj)是有序的,那么稱該圖為有向圖。這里Vi是弧尾,Vj是弧頭。這表示有一個從頂點(diǎn)Vi到頂點(diǎn)Vj的路徑。但是從Vj到Vi是不可能的
無向圖:在一個圖中,如果有任意兩頂點(diǎn)構(gòu)成的邊(Vi,Vj),(Vi,Vj)和(Vj,Vi)是相同的在一個無向圖中,如果任意兩個頂點(diǎn)之間都有邊相連,則稱該圖為無向完全圖。無向完全圖又稱完全圖在一個有向圖,如果任意兩個頂點(diǎn)之間都是弧相連,則稱該圖為有向完全圖。有很少條邊或弧的圖稱為稀疏圖,反之稱為稠密圖。第6頁,共48頁,2023年,2月20日,星期四SetNode():在圖中增加一個新的頂點(diǎn)
GetNode():獲取圖中指定頂點(diǎn)SetEdge():在兩個頂點(diǎn)之間添加指定權(quán)值的邊或弧GetEdge():獲取兩個頂點(diǎn)之間的邊DelEdge():刪除兩個頂點(diǎn)之間的邊或弧GetNumOfVertex():獲取鄰接矩陣頂點(diǎn)數(shù)GetNumOfEdge():獲取鄰接矩陣邊或弧的數(shù)目GetIndex():獲取指定頂點(diǎn)在數(shù)組中的索引IsEdge():判斷兩個頂點(diǎn)之間是否存在邊或弧IsNode():判斷指定結(jié)點(diǎn)是否是圖的頂點(diǎn)認(rèn)識圖——識別圖的基本操作圖的基本操作有以下幾種:第7頁,共48頁,2023年,2月20日,星期四鄰接矩陣(AdjacentcyMatrix)是用兩個數(shù)組來表示圖,一個數(shù)組是一維數(shù)組,存儲圖中的頂點(diǎn)信息,一個數(shù)組是二維數(shù)組,即矩陣,存儲頂點(diǎn)之間相鄰的信息,也就是邊(或?。┑男畔ⅰH绻麍D中有n個頂點(diǎn),你需要大小為n×n的二維數(shù)組來表示圖。用C#語言表示鄰接矩陣的代碼參見P190頁用鄰接矩陣解決圖的編程問題
——用鄰接矩陣表示圖對鄰接矩陣進(jìn)行操作參見P191頁代碼。第8頁,共48頁,2023年,2月20日,星期四鄰接表的存儲方法是一種順序存儲與鏈?zhǔn)酱鎯ο嘟Y(jié)合的存儲方法,順序存儲部分用來保存圖中頂點(diǎn)的信息,鏈?zhǔn)酱鎯Σ糠钟脕肀4鎴D中邊(或?。┑男畔?。具體的做法是:使用一個一維數(shù)組,其中每個數(shù)組元素包含兩個域,其結(jié)構(gòu)如右圖所示。
其中
頂點(diǎn)域(data):存放與頂點(diǎn)有關(guān)的信息;頭指針域(firstadj):存放與該頂點(diǎn)相鄰接的所有頂點(diǎn)組成的單鏈表的頭指針
用鄰接表解決圖的編程問題
——用鄰接表表示圖鄰接單鏈表中每個結(jié)點(diǎn)表示依附于該頂點(diǎn)的一條邊,稱作邊結(jié)點(diǎn),邊結(jié)點(diǎn)的結(jié)構(gòu)如右圖所示。
其中鄰接點(diǎn)域(adjvex):指示與頂點(diǎn)鄰接點(diǎn)在圖中的位置,對應(yīng)著一維數(shù)組中的序號,對于有向圖,存放的是該邊結(jié)點(diǎn)所表示的弧的弧頭頂點(diǎn)在一維數(shù)組中的序號;數(shù)據(jù)域(info):存儲邊或弧相關(guān)的信息,如權(quán)值等,當(dāng)圖中邊(或?。┎缓行畔r,該域可以省略。鏈域(nextadj):指向依附于該頂點(diǎn)的下一個邊結(jié)點(diǎn)的指針。
無向圖鄰接表的鄰接表結(jié)點(diǎn)類的代碼參見P197頁。第9頁,共48頁,2023年,2月20日,星期四用鄰接表解決圖的編程問題
——用鄰接表表示圖(舉例)
對鄰接表進(jìn)行操作的代碼參見P199頁。第10頁,共48頁,2023年,2月20日,星期四9.4解決圖的遍歷問題——深度優(yōu)先搜索1.理解深度優(yōu)先搜索算法
從圖的某一頂點(diǎn)x出發(fā),訪問x,然后遍歷任何一個與x相鄰的未被訪問的頂點(diǎn)y,再遍歷任何一個與y相鄰的未被訪問的頂點(diǎn)z……,如此下去,直到到達(dá)一個所有鄰接點(diǎn)都被訪問的頂點(diǎn)為止。然后依次回退到尚有鄰接點(diǎn)未被訪問過的頂點(diǎn),重復(fù)上述過程,直到圖中的全部頂點(diǎn)都被訪問過為止。 對圖進(jìn)行深度優(yōu)先遍歷。深度優(yōu)先遍歷背后基于堆棧,有2種形式:第一種是程序中顯示構(gòu)造堆棧,利用壓棧出棧操作實現(xiàn);第二種是利用遞歸函數(shù)調(diào)用,基于
遞歸程序棧實現(xiàn)。本章介紹壓棧和出棧的操作。第11頁,共48頁,2023年,2月20日,星期四v1將起始頂點(diǎn)v1壓入棧。9.4解決圖的遍歷問題——深度優(yōu)先搜索第12頁,共48頁,2023年,2月20日,星期四v1將頂點(diǎn)v1彈出棧訪問v1在棧中壓入所有與v1相鄰接的未訪問頂點(diǎn)v1Visited:9.4解決圖的遍歷問題——深度優(yōu)先搜索第13頁,共48頁,2023年,2月20日,星期四v4從棧中彈出頂點(diǎn)v1訪問v1在棧中壓入所有與v1相鄰接的未訪問頂點(diǎn)v1Visited:v29.4解決圖的遍歷問題——深度優(yōu)先搜索第14頁,共48頁,2023年,2月20日,星期四Visited:從棧中彈出頂點(diǎn)v2訪問v2在棧中壓入所有與v2相鄰接的未訪問頂點(diǎn)v1v2v4v29.4解決圖的遍歷問題——深度優(yōu)先搜索第15頁,共48頁,2023年,2月20日,星期四Visited:從棧中彈出頂點(diǎn)v2訪問v2在棧中壓入所有與v2相鄰接的未訪問頂點(diǎn)v1v2v3v6v49.4解決圖的遍歷問題——深度優(yōu)先搜索第16頁,共48頁,2023年,2月20日,星期四Visited:從棧中彈出頂點(diǎn)v3訪問v3在棧中壓入所有與v3相鄰接的未訪問頂點(diǎn)v1v2v3有與v3相鄰接的未訪問頂點(diǎn)v6v3v49.4解決圖的遍歷問題——深度優(yōu)先搜索第17頁,共48頁,2023年,2月20日,星期四Visited:從棧中彈出頂點(diǎn)v3訪問v3在棧中壓入所有與v3相鄰接的未訪問頂點(diǎn)v1v2v3有與v3相鄰接的未訪問頂點(diǎn)v6v5v49.4解決圖的遍歷問題——深度優(yōu)先搜索第18頁,共48頁,2023年,2月20日,星期四Visited:從棧中彈出頂點(diǎn)v5訪問v5在棧中壓入所有與v5相鄰接的未訪問頂點(diǎn)v1v2v3v5v6v49.4解決圖的遍歷問題——深度優(yōu)先搜索v5第19頁,共48頁,2023年,2月20日,星期四Visited:從棧中彈出頂點(diǎn)v6訪問v6在棧中壓入所有與v6相鄰接的未訪問頂點(diǎn)v1v2v3v5v6v6v49.4解決圖的遍歷問題——深度優(yōu)先搜索第20頁,共48頁,2023年,2月20日,星期四Visited:從棧中彈出頂點(diǎn)v4訪問v4在棧中壓入所有與v4相鄰接的未訪問頂點(diǎn)v1v2v3v5v6v4v49.4解決圖的遍歷問題——深度優(yōu)先搜索第21頁,共48頁,2023年,2月20日,星期四Visited:?,F(xiàn)在是空的因此,遍歷完成v1v2v3v5v6v49.4解決圖的遍歷問題——深度優(yōu)先搜索第22頁,共48頁,2023年,2月20日,星期四盡管上述算法提供了一個簡單和常用的方法來遍歷圖,但是,如果圖不是連接的,算法將不能正確工作。在這樣的情況下,你將不能夠從單個起始頂點(diǎn)開始遍歷所有頂點(diǎn)。
9.4解決圖的遍歷問題——深度優(yōu)先搜索第23頁,共48頁,2023年,2月20日,星期四為了解決這個問題,你需要對圖中所有未訪問頂點(diǎn)重復(fù)執(zhí)行上述算法。對圖中每個頂點(diǎn)v重復(fù)步驟2如果v未被訪問:
a.調(diào)用DFS(v)9.4解決圖的遍歷問題——深度優(yōu)先搜索第24頁,共48頁,2023年,2月20日,星期四9.4解決圖的遍歷問題——廣度優(yōu)先搜索2.理解廣度優(yōu)先搜索算法
圖的廣度優(yōu)先搜索是從圖的某個頂點(diǎn)x出發(fā),訪問x。然后訪問與x相鄰接的所有未被訪問的頂點(diǎn)x1,x2,….,xn;接著再依次訪問與x1,x2,….,xn相鄰接的未被訪問過的所有頂點(diǎn)。依此類推,直至圖的每個頂點(diǎn)都被訪問。第25頁,共48頁,2023年,2月20日,星期四訪問v1將v1插入隊列v1v19.4解決圖的遍歷問題——廣度優(yōu)先搜索第26頁,共48頁,2023年,2月20日,星期四從隊列中刪除頂點(diǎn)v1訪問與v1相鄰接的所有未訪問頂點(diǎn)并將它們插入隊列v1v1Visited:9.4解決圖的遍歷問題——廣度優(yōu)先搜索第27頁,共48頁,2023年,2月20日,星期四從隊列中刪除頂點(diǎn)v1訪問與v1相鄰接的所有未訪問頂點(diǎn)并將它們插入隊列v2v1v2v4v49.4解決圖的遍歷問題——廣度優(yōu)先搜索第28頁,共48頁,2023年,2月20日,星期四從隊列中刪除頂點(diǎn)v2訪問與v2相鄰接的所有未訪問頂點(diǎn)并將它們插入隊列v2v1v2v4v49.4解決圖的遍歷問題——廣度優(yōu)先搜索第29頁,共48頁,2023年,2月20日,星期四從隊列中刪除頂點(diǎn)v4訪問與v4相鄰接的所有未訪問頂點(diǎn)并將它們插入隊列v1v2v4v4v3v3v6v6v5v59.4解決圖的遍歷問題——廣度優(yōu)先搜索第30頁,共48頁,2023年,2月20日,星期四從隊列中刪除頂點(diǎn)v3訪問與v3相鄰接的所有未訪問頂點(diǎn)并將它們插入隊列v1v2v4v3v3v6v6v5v5v3沒有任何未訪問的鄰接頂點(diǎn)9.4解決圖的遍歷問題——廣度優(yōu)先搜索第31頁,共48頁,2023年,2月20日,星期四從隊列中刪除頂點(diǎn)v6訪問與v6相鄰接的所有未訪問頂點(diǎn)并將它們插入隊列v1v2v4v3v6v6v5v5v3沒有任何未訪問的鄰接頂點(diǎn)9.4解決圖的遍歷問題——廣度優(yōu)先搜索第32頁,共48頁,2023年,2月20日,星期四從隊列中刪除頂點(diǎn)v5訪問與v5相鄰接的所有未訪問頂點(diǎn)并將它們插入隊列v1v2v4v3v6v5v5v6沒有任何未訪問的鄰接頂點(diǎn)9.4解決圖的遍歷問題——廣度優(yōu)先搜索第33頁,共48頁,2023年,2月20日,星期四隊列現(xiàn)在是空的因此,遍歷完成v1v2v4v3v6v5v5沒有任何未訪問的鄰接頂點(diǎn)9.4解決圖的遍歷問題——廣度優(yōu)先搜索第34頁,共48頁,2023年,2月20日,星期四盡管上述算法提供了一個簡單和方便的遍歷圖的方法,但是,如果圖不是連接的,算法將不能正確工作。在這樣的情況中,你將不能從單個開始頂點(diǎn)遍歷所有頂點(diǎn)。9.4解決圖的遍歷問題——廣度優(yōu)先搜索第35頁,共48頁,2023年,2月20日,星期四為了解決這個問題,你需要對圖中的未訪問頂點(diǎn)重復(fù)執(zhí)行這個算法。為圖中每個頂點(diǎn)V重復(fù)步驟2。如果v未被訪問:
a.調(diào)用BFS(v)9.4解決圖的遍歷問題——廣度優(yōu)先搜索第36頁,共48頁,2023年,2月20日,星期四圖的最短路徑問題
——Dijkstra算法的引入Dijkstra算法的基本思想是:設(shè)置兩個頂點(diǎn)集合T和S,集合S中存放己經(jīng)找到最短路徑的頂點(diǎn),集合T中存放當(dāng)前還未找到最短路徑的頂點(diǎn)。初始狀態(tài)時,集合S中只包含源點(diǎn)v0,然后不斷從集合T中選取到源點(diǎn)v0路徑長度最短的頂點(diǎn)w加入集合S,集合S中每加入一個新的頂點(diǎn)w,都要修改頂點(diǎn)v0到集合T中剩余頂點(diǎn)的最短路徑長度值,集合T中各頂點(diǎn)新的最短路徑長度值為原來最短路徑長度值與頂點(diǎn)w的最短路徑長度加上w到該頂點(diǎn)的路徑長度值中的較小值。此過程不斷重復(fù),直到集合T的頂點(diǎn)全部加入集合S為止。第37頁,共48頁,2023年,2月20日,星期四圖的最短路徑問題
——分析高速公路交通網(wǎng)的最短路徑
下面用Dijkstra算法解決高速公路最短路徑的問題?,F(xiàn)在假設(shè)高速公路交通網(wǎng)采用鄰接矩陣作為存儲結(jié)構(gòu)。若鄰接矩陣為matrix,并規(guī)定:用Dijkstra算法來確定從城市A到其他城市的最短踐離。Dijkstra算法的步驟參見教材P212頁第38頁,共48頁,2023年,2月20日,星期四finaldistance110000090∞150∞180圖的最短路徑問題
——分析高速公路交通網(wǎng)的最短路徑
ABCDEF012345第39頁,共48頁,2023年,2月20日,星期四finaldistance110000090150140∞180圖的最短路徑問題
——分析高速公路交通網(wǎng)的最短路徑
ABCDEF012345第40頁,共48頁,2023年,2月20日,星期四finaldistance110100090150140∞180圖的最短路徑問題
——分析高速公路交通網(wǎng)的最短路徑
ABCDEF012345第41頁,共48頁,2023年,2月20日,星期四finaldistance110100090150140250180圖的最短路徑問題
——分析高速公路交通網(wǎng)的最短路徑
ABCDEF012345第42頁,共48頁,2023年,2月20日,星期四finaldistance111100090150140250180圖的最短路徑問題
——分析高速公路交通網(wǎng)的最短路徑
ABCDEF0
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年合肥高新公共資源交易有限公司招聘4人筆試參考題庫附帶答案詳解
- 23周而復(fù)始的循環(huán) 教學(xué)設(shè)計 2023-2024學(xué)年高中信息技術(shù)教科版(2020)必修1
- 第五章 第3節(jié) 凸透鏡成像的規(guī)律2024-2025學(xué)年新教材八年級上冊物理新教學(xué)設(shè)計(人教版2024)
- 第3課 中古時期的歐洲教學(xué)設(shè)計-2023-2024學(xué)年高中歷史統(tǒng)編版(2019)必修中外歷史綱要下冊
- 2025年華東政法大學(xué)單招職業(yè)適應(yīng)性測試題庫完整
- 2025年掃瞄隧道顯微鏡項目建議書
- 2024年12月貴州省安順市黃果樹公證處公開招聘公證員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 第二章《有理數(shù)的運(yùn)算》單元備課教學(xué)設(shè)計2024-2025學(xué)年人教版數(shù)學(xué)七年級上冊
- 《臨安春雨初霽》教學(xué)設(shè)計 2023-2024學(xué)年統(tǒng)編版高中語文選擇性必修下冊
- 2023-2024學(xué)年人教版高中信息技術(shù)必修一第二章第二節(jié)《算法的概念及描述》教學(xué)設(shè)計
- 煤礦違章行為及預(yù)防
- 幼兒園中班下學(xué)期語言繪本-沙灘上
- 電氣工程師生涯人物訪談報告
- 無人機(jī)在公安領(lǐng)域的應(yīng)用
- 水力學(xué)電子教案
- 國家重點(diǎn)保護(hù)古生物化石及產(chǎn)地名錄(2011年)
- 校園超市經(jīng)營投標(biāo)方案(完整技術(shù)標(biāo))
- 第三單元《手拉手》大單元(教學(xué)設(shè)計)人音版音樂一年級下冊
- 《義務(wù)教育數(shù)學(xué)課程標(biāo)準(zhǔn)(2022年版)》解讀
- 如何做好一名IPQC課件
- 《廣東省高級會計師資格評審表填表范例》
評論
0/150
提交評論