




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十二章圖
12.1圖的定義
(1)圖是由一個(gè)頂點(diǎn)集和連接各頂點(diǎn)的邊集組成。它可以用二元組G=(V,E)表示,其中
V表示頂點(diǎn)集,E表示邊集。
(2)如果邊有方向,則稱有向圖,<u,v>表示從u出發(fā)到v的一條邊;與之對(duì)應(yīng)的是無(wú)
向圖,(u,v)
(3)有時(shí)邊還有第三個(gè)屬性,稱為邊的代價(jià)或權(quán)值,用來(lái)表示經(jīng)過(guò)這條邊所花費(fèi)的代
價(jià),這樣的圖稱為加權(quán)圖(有向加權(quán)圖、無(wú)向加權(quán)圖)加權(quán)圖中的每條邊由3個(gè)分量表
示:兩個(gè)頂點(diǎn)和權(quán)值
(4)稀疏圖:|E|遠(yuǎn)遠(yuǎn)小于|V?|
理想下的邊數(shù)|E|=|V2|-|V|,例如右圖:|E|=32=3=6
12.2圖的基本術(shù)語(yǔ)
⑴鄰接
如(Vi,Vj)是無(wú)向圖中的一條邊,則稱Vi和Vj鄰接
(2)度
在無(wú)向圖中,結(jié)點(diǎn)的度是與該結(jié)點(diǎn)關(guān)聯(lián)的邊數(shù);在有向圖中,度分為出度和入度。
(3)子圖
假設(shè)G=(V,E)和GJ(V',E如果V'包含于V,E'包含于E,,則稱G'是G的子圖。
(4)路徑和路徑長(zhǎng)度
路徑是指圖中由邊連接而成的結(jié)點(diǎn)序列。
非加權(quán)的路徑長(zhǎng)度就是指組成路徑的邊數(shù),為N-l(N為結(jié)點(diǎn)個(gè)數(shù))
加權(quán)的路徑長(zhǎng)度就是指路徑上所有邊的權(quán)值之和。
(5)連通圖和連通分量
如果一個(gè)無(wú)向圖G的任意兩個(gè)結(jié)點(diǎn)之間都是連通的(即有路徑),則稱G是連通圖;每
一個(gè)非連通圖都可以分成幾個(gè)極大的連通的部分,每一個(gè)極大的連通子圖稱為一個(gè)連通
分量。
0------------------?
?----?
(6)強(qiáng)連通圖和強(qiáng)連通分量
如果有向圖G的任意兩個(gè)結(jié)點(diǎn)之間都是連通的,則稱G是強(qiáng)連通圖。
對(duì)于非強(qiáng)連通圖,會(huì)有強(qiáng)連通分量。
(7)完全圖
每?jī)蓚€(gè)結(jié)點(diǎn)之間都有邊的無(wú)向圖稱為無(wú)向完全圖;每?jī)蓚€(gè)結(jié)點(diǎn)之間都有兩條弧的有向圖
稱為有向完全圖。
(8)生成樹(shù)
生成樹(shù)是國(guó)同連通圖的極小連通子圖,n-l條邊使得n個(gè)結(jié)點(diǎn)互相連通,在生成樹(shù)中添
加一條邊,必定會(huì)形成回路或環(huán)。
12.3圖的基本運(yùn)算
構(gòu)成圖;判斷兩條邊之間是否有邊的存在exist;在圖中添加或刪除一條邊insert/remove;
返回圖中的結(jié)點(diǎn)數(shù)或邊數(shù);遍歷圖中所有結(jié)點(diǎn)。
12.4圖的存儲(chǔ)
12.4.1鄰接矩陣表示法
(1)若頂點(diǎn)i、j之間存在一條自i到j(luò)的有向邊或無(wú)向邊,那么A[i]0]=l,否則A「Hj]=O
或者無(wú)窮大。
01010
11010
01010
11010
01010
11010
(2)對(duì)于無(wú)向圖,鄰接矩陣第i行或第i列的元素之和是第i個(gè)結(jié)點(diǎn)的度;
對(duì)于有向圖,鄰接矩陣的第i行元素之和是出度,第j列元素之和是入度。
(3)圖的鄰接矩陣存儲(chǔ)需要兩個(gè)部分:一個(gè)是存儲(chǔ)結(jié)點(diǎn)值的數(shù)組;一個(gè)是存儲(chǔ)邊的鄰
接矩陣。
12-2基于鄰接矩陣的圖類定義
template<classTypeOfVer,classTypeOfEdge>
classadjMatrixGraph:publicgraph<TypeOfEdge>{〃7意味著“繼承自”,鄰接矩陣?yán)^承自
圖的抽象類
public:〃公有成員函數(shù)
adjMatrixGraph(intvSize,constTypeOfVerd[],constTypeOfEdgenoEdgeFlag);
〃構(gòu)造函數(shù),三個(gè)參數(shù),vSize頂點(diǎn)個(gè)數(shù),頂點(diǎn)值數(shù)組,結(jié)點(diǎn)間不存在邊的標(biāo)志
boolinsert(intujntv,TypeOfEdgew);〃插入一條邊
boolremove(intu,intv);〃刪除條邊
boolexist(intu,intv)const;〃彳j爾類型,fepoL非真即假,返回常數(shù),是否存
在邊
~adjMatrixGraph();〃析構(gòu)函數(shù)
private:〃私有成員變址
TypeOfEdge**edge;〃存放鄰接處:陣,二維數(shù)組
TypeOfVer*ver;〃仃
TypeOfEdgenoedge;〃結(jié)點(diǎn)間不存在邊的標(biāo)志
12-3adjMatrixGraph類的構(gòu)造函數(shù)
template<classTypeOfVer,classTypeOfEdge>
adjMatrixGraph<TypeOfVer,TypeOfEdge>::adjMatrixGraph(intvSize,constTypeOfVerd[],
constTypeOfEdgenoEdgeFlag)〃構(gòu)造函數(shù)有3個(gè)參數(shù):結(jié)點(diǎn)數(shù)、結(jié)點(diǎn)值和鄰接矩陣中表
示結(jié)點(diǎn)間無(wú)邊的標(biāo)記,構(gòu)造函數(shù)根據(jù)這3個(gè)參數(shù)構(gòu)造?個(gè)只有結(jié)點(diǎn)沒(méi)有邊的圖
{inti,j;
Vers=vSize;//設(shè)置存儲(chǔ)結(jié)點(diǎn)數(shù)
Edges=0;〃邊數(shù)
noEdge=noEdgeFlag;〃無(wú)邊標(biāo)記
ver=newTypeOfVer[vSize];〃申請(qǐng)一個(gè)存儲(chǔ)結(jié)點(diǎn)的一維數(shù)組ver,
for(i=0;i<vSize;++i)ver[i]=d[i];//for循環(huán)把參數(shù)中給出的結(jié)點(diǎn)值保存在數(shù)組ver中
edge=newTypeOfEdge*[vSize];
〃鄰接矩陣egde是一個(gè)vSize*vSize的矩陣,而二維數(shù)組可以看成一個(gè)指向一維數(shù)組的
指針數(shù)組,所以此行為申請(qǐng)一個(gè)指向一維數(shù)組的指針數(shù)組edge
for(i=0;i<vSize;++i){〃對(duì)鄰接矩陣111的每一行進(jìn)行初始化
edge[i]=newTypeOfEdge[vSize];〃為鄰接矩陣的這?行申請(qǐng)空間
for(j=0;j<vSize;++j)edge[i][j]=noEdge;〃將每個(gè)元素都設(shè)成“沒(méi)有邊”
edge「Hi]=O;〃把自己到自己的邊的權(quán)值設(shè)為0
)
)
12-4adjMatrixGraph類的析構(gòu)函數(shù)
template<classTypeOfVer,classTypeOfEdge>
adjMatrixGraph<TypeOfVer,TypeOfEdge>::~adjMatrixGraph()
(
delete[]ver;〃釋放了存放站點(diǎn)俏.的?維數(shù)組的空間
for(inti=O;i<Vers;++i)delete[]edge。];〃循環(huán)釋放保存鄰接矩陣的空間,edge是鄰接
矩陣,for的每個(gè)循環(huán)周期釋放了鄰接矩陣的一行
delete1]edge;//#^了指向鄰接矩陣每一行首地址的指針―
)
12-5adjMatrixGraph類其它成員函數(shù)的實(shí)現(xiàn)
template<classTypeOfVer,classTypeOfEdge>
booladjMatrixGraph<TypeOfVer,TypeOfEdge>::|insert|(intu,intv,TypeOfEdgew)
〃插入函數(shù),參數(shù)是邊,起點(diǎn)為u,終點(diǎn)為v,權(quán)重為w
{if(u<O||u>Vers-l||v<O||v>Vers-l)returnflase;〃檢查作為參數(shù)輸入的邊是否合法
if(edge[u][v]!=noEdge)returnfalse;〃檢查被捅入的邊是否存隹,如果存在,返回false
edge[u][v]=w;〃若不存在,則在鄰接矩陣中添加相應(yīng)的邊
++Edge;〃邊數(shù)+1
returntrue;〃返叵Itrue我示插入成功
)
template<classTypeOfVer,classTypeOfEdge>
booladjMatrixGraph<TypeOfVer,TypeOfEdge>::|remove|(intu,intv)
{if(u<0||u>Vers?l||v<0]|v>Vers-1)returnflase;〃檢彳f作為參數(shù)輸入的邊是否合法
if(edge[u][v]==noEdge)returnfalse;〃檢查所刪除的邊是否存在,如果不存在,返回
false
edge[u][v]=noEdge;〃如果存在,則將對(duì)應(yīng)的數(shù)組無(wú)戈noEdge
-Edge;〃邊數(shù);
returntrue;//i£P(guān)Itrue表示刪除成功
)
template<classTypeOfVer,classTypeOfEdge>
booladjMatrixGraph<TypeOfVer,TypeOfEdge>::|exist|(intujntv)const
{if(u<0||u>Vers-l||v<0||v>Vers-l)returnflase;〃檢查作為參數(shù)輸入的邊是否合法
if(edge[u][v]==noEdge)returnfalse;〃判斷邊是否存在,不存在返1nlfalse
elsereturntrue;〃存隹返回true
}
12.4.2鄰接表表示法
(1)基本定義
將每個(gè)結(jié)點(diǎn)的鄰接結(jié)點(diǎn)組成一個(gè)鏈表,鏈表的每個(gè)結(jié)點(diǎn)代表一條邊。
左邊圖只是右邊的部分表示
(2)保存方法
在鄰接表表示法中,保存一個(gè)圖同樣分為兩部分:保存頂點(diǎn)和保存邊。
頂點(diǎn)集|用一個(gè)數(shù)組表示,數(shù)組中每個(gè)元素由兩部分組成:頂點(diǎn)值和指向該頂點(diǎn)對(duì)應(yīng)的鏈
表的首地址,即:data和link兩部分。
睡由一組單鏈表表示。①非加權(quán)圖②加權(quán)圖
終止結(jié)點(diǎn)的編號(hào)后繼指針
datalink
權(quán)值終止結(jié)點(diǎn)的編號(hào)后繼指針
costdatalink
(3)有向圖和無(wú)向圖保存方法比較之處
①有向圖
每條邊都作為一個(gè)單鏈表的結(jié)點(diǎn)出現(xiàn),所以所有頂點(diǎn)對(duì)應(yīng)的單鏈表的結(jié)點(diǎn)總數(shù)=圖的邊
數(shù)
②無(wú)向圖
每條邊在鄰接表中將出現(xiàn)兩次,例如(x,y),在x的單鏈表中有一個(gè)以y為終點(diǎn)的結(jié)點(diǎn),
在y的單鏈表中有一個(gè)以x為終點(diǎn)的結(jié)點(diǎn),所以所有頂點(diǎn)對(duì)應(yīng)的單鏈表的結(jié)點(diǎn)總數(shù)=圖
邊數(shù)的兩倍。
12-6鄰接表類的定義
template<classTypeOfVers,classTypeOfEdge>
classadjListGraph:publicgraph<TypeOfEdge>{
public:
adjListGraph(intvSize,constTypeOfVerd[]);〃構(gòu)造函數(shù)
boolinsert(intujntvJypeOfEdgew);〃插入邊
boolremove(intujntv);〃刪除邊
boolexist(intujntv)const;〃是否存在
~adjListGraph。;〃析構(gòu)函數(shù)
private:
structedgeNode{〃為了保存邊的信息,定義一個(gè)單.鏈表中的結(jié)點(diǎn)類型edgeNode
intend;〃終止結(jié)點(diǎn)的編號(hào)
TypeOfEdgeweight;〃權(quán)重
edgeNode*next;〃后繼指針
edgeNode(inte,TypeOfEdgew,edgeNode*n=NULL)
{end=e;weight=w;next=n;}
);
structverNode{〃為了保存頂點(diǎn)的*定義了一個(gè)保存頂點(diǎn)的數(shù)組中的結(jié)點(diǎn)類型
verNode
TypeOfVerver;
edgeNode*head;〃頂點(diǎn)的首地址
verNode(edgeNode*n=NULL)〃后繼指針
{head=h;}
);
verNode*verList;//保存頂點(diǎn)數(shù)組的首地址
);
verListedaeNode
12-7adjListGraph類的構(gòu)造函數(shù)和析構(gòu)函數(shù)
template<classTypeOfVers,classTypeOfEdge>
adjListGraph<TypeOfVers,TypeOfEdge>::adjListGraphfintvSize,constTypeOfVerd[])
{Vers=vSize;Edges=O;〃根據(jù)參數(shù)表中給出的頂點(diǎn)個(gè)數(shù)中請(qǐng)?個(gè)存儲(chǔ)頂點(diǎn)的數(shù)組,并設(shè)得
個(gè)頂點(diǎn)對(duì)應(yīng)的單鏈表為空
verList=newverNode[vSize];〃把數(shù)組首地址賦給verList
for(inti=O;i<Vers;++i)verList[i].ver=d「];〃將參數(shù)表中給出的頂點(diǎn)值存入該數(shù)組
}
template<classTypeOfVers,classTypeOfEdge>
adjListGraph<TypeOfVers,TypeOfEdge>::~adjListGraph|()
{inti;
edgeNode*p;〃臨時(shí)指針
for(i=0;i<Vers;++i)//?次循環(huán)刪除?條單鏈表,即?個(gè)頂點(diǎn)的所有邊
while((p=verList[i].head)!=NULL){(l)
verList[i].head=p->next;(2)
deletep;③〃三步刪除一條單.鏈表中的一個(gè)結(jié)點(diǎn)
}
delete[]verList;〃釋放存儲(chǔ)頂點(diǎn)的數(shù)組的空間
}
verListedaeNode
12-8insert函數(shù)的實(shí)現(xiàn)
template<classTypeOfVers,classTypeOfEdge>
adjListGraph<TypeOfVers,TypeOfEdge>::insert(intu,intv,TypeOfEdgew)
{verList[u].head=newedgeNode(v,w,verList[u].head);〃為新插入的邊申請(qǐng)-~個(gè)單鏈表'I1的
結(jié)點(diǎn),然后將新插入的邊對(duì)應(yīng)的結(jié)點(diǎn)插入到單鏈表的表頭
++Edges;〃邊數(shù)+工
returntrue;
}
12-9remove函數(shù)的實(shí)現(xiàn)
template<classTypeOfVers,classTypeOfEdge>
adjListGraph<TypeOfVers,TypeOfEdge>::|remove|(intu,intv)
{edgeNode*p=verList[u].head,*q;
verListedaeNode
if(p==NULL)returnfalse;
if(p->end==v)〃7;第一個(gè)結(jié),就是要?jiǎng)h除的結(jié)點(diǎn)
{verList[u].head=p->next;
deletep;--Edges;
returntrue;
)
4
whil
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 校醫(yī)聘用合同范本
- 工程合同抵押貸款合同范本
- Maytansine-derivative-M24-生命科學(xué)試劑-MCE
- Enzyme-IN-3-disodium-生命科學(xué)試劑-MCE
- 科技短視頻創(chuàng)新技術(shù)傳播策略
- 電子俱樂(lè)部合同范本
- 東莞廣東東莞市自然資源局黃江分局自主(公開(kāi))招聘聘用人員筆試歷年參考題庫(kù)附帶答案詳解
- 修房建筑合同范本
- epc設(shè)備合同范本
- 知識(shí)產(chǎn)權(quán)在科技創(chuàng)新中的價(jià)值體現(xiàn)與保護(hù)
- 繪本閱讀《鐵絲網(wǎng)上的小花》
- NancyDrew分析
- 離心式排風(fēng)機(jī)安裝施工方案及技術(shù)措施
- 中西紀(jì)年對(duì)照表
- 字號(hào)大小樣式設(shè)計(jì)參照表
- 理想信念主題班會(huì)ppt課件
- 粵勞社[2002]246號(hào)關(guān)于職工在機(jī)關(guān)事業(yè)單位與企業(yè)之間流動(dòng)時(shí)社會(huì)保險(xiǎn)關(guān)系處理意見(jiàn)的通知
- 風(fēng)險(xiǎn)和機(jī)遇評(píng)估分析表
- 五年級(jí)下冊(cè)勞動(dòng)教案(最新完整版)
- 中英文Bimco標(biāo)準(zhǔn)船舶管理協(xié)議
- 通信防雷與接地系統(tǒng)PPT學(xué)習(xí)教案
評(píng)論
0/150
提交評(píng)論