




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第十二章圖
12.1圖的定義
(1)圖是由一個頂點(diǎn)集和連接各頂點(diǎn)的邊集組成。它可以用二元組G=(V,E)表示,其中
V表示頂點(diǎn)集,E表示邊集。
(2)如果邊有方向,則稱有向圖,<u,v>表示從u出發(fā)到v的一條邊;與之對應(yīng)的是無
向圖,(u,v)
(3)有時邊還有第三個屬性,稱為邊的代價或權(quán)值,用來表示經(jīng)過這條邊所花費(fèi)的代
價,這樣的圖稱為加權(quán)圖(有向加權(quán)圖、無向加權(quán)圖)加權(quán)圖中的每條邊由3個分量表
示:兩個頂點(diǎn)和權(quán)值
(4)稀疏圖:|E|遠(yuǎn)遠(yuǎn)小于|V?|
理想下的邊數(shù)|E|=|V2|-|V|,例如右圖:|E|=32=3=6
12.2圖的基本術(shù)語
⑴鄰接
如(Vi,Vj)是無向圖中的一條邊,則稱Vi和Vj鄰接
(2)度
在無向圖中,結(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)路徑和路徑長度
路徑是指圖中由邊連接而成的結(jié)點(diǎn)序列。
非加權(quán)的路徑長度就是指組成路徑的邊數(shù),為N-l(N為結(jié)點(diǎn)個數(shù))
加權(quán)的路徑長度就是指路徑上所有邊的權(quán)值之和。
(5)連通圖和連通分量
如果一個無向圖G的任意兩個結(jié)點(diǎn)之間都是連通的(即有路徑),則稱G是連通圖;每
一個非連通圖都可以分成幾個極大的連通的部分,每一個極大的連通子圖稱為一個連通
分量。
0------------------?
?----?
(6)強(qiáng)連通圖和強(qiáng)連通分量
如果有向圖G的任意兩個結(jié)點(diǎn)之間都是連通的,則稱G是強(qiáng)連通圖。
對于非強(qiáng)連通圖,會有強(qiáng)連通分量。
(7)完全圖
每兩個結(jié)點(diǎn)之間都有邊的無向圖稱為無向完全圖;每兩個結(jié)點(diǎn)之間都有兩條弧的有向圖
稱為有向完全圖。
(8)生成樹
生成樹是國同連通圖的極小連通子圖,n-l條邊使得n個結(jié)點(diǎn)互相連通,在生成樹中添
加一條邊,必定會形成回路或環(huán)。
12.3圖的基本運(yùn)算
構(gòu)成圖;判斷兩條邊之間是否有邊的存在exist;在圖中添加或刪除一條邊insert/remove;
返回圖中的結(jié)點(diǎn)數(shù)或邊數(shù);遍歷圖中所有結(jié)點(diǎn)。
12.4圖的存儲
12.4.1鄰接矩陣表示法
(1)若頂點(diǎn)i、j之間存在一條自i到j(luò)的有向邊或無向邊,那么A[i]0]=l,否則A「Hj]=O
或者無窮大。
01010
11010
01010
11010
01010
11010
(2)對于無向圖,鄰接矩陣第i行或第i列的元素之和是第i個結(jié)點(diǎn)的度;
對于有向圖,鄰接矩陣的第i行元素之和是出度,第j列元素之和是入度。
(3)圖的鄰接矩陣存儲需要兩個部分:一個是存儲結(jié)點(diǎn)值的數(shù)組;一個是存儲邊的鄰
接矩陣。
12-2基于鄰接矩陣的圖類定義
template<classTypeOfVer,classTypeOfEdge>
classadjMatrixGraph:publicgraph<TypeOfEdge>{〃7意味著“繼承自”,鄰接矩陣?yán)^承自
圖的抽象類
public:〃公有成員函數(shù)
adjMatrixGraph(intvSize,constTypeOfVerd[],constTypeOfEdgenoEdgeFlag);
〃構(gòu)造函數(shù),三個參數(shù),vSize頂點(diǎn)個數(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個參數(shù):結(jié)點(diǎn)數(shù)、結(jié)點(diǎn)值和鄰接矩陣中表
示結(jié)點(diǎn)間無邊的標(biāo)記,構(gòu)造函數(shù)根據(jù)這3個參數(shù)構(gòu)造?個只有結(jié)點(diǎn)沒有邊的圖
{inti,j;
Vers=vSize;//設(shè)置存儲結(jié)點(diǎn)數(shù)
Edges=0;〃邊數(shù)
noEdge=noEdgeFlag;〃無邊標(biāo)記
ver=newTypeOfVer[vSize];〃申請一個存儲結(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是一個vSize*vSize的矩陣,而二維數(shù)組可以看成一個指向一維數(shù)組的
指針數(shù)組,所以此行為申請一個指向一維數(shù)組的指針數(shù)組edge
for(i=0;i<vSize;++i){〃對鄰接矩陣111的每一行進(jìn)行初始化
edge[i]=newTypeOfEdge[vSize];〃為鄰接矩陣的這?行申請空間
for(j=0;j<vSize;++j)edge[i][j]=noEdge;〃將每個元素都設(shè)成“沒有邊”
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的每個循環(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;〃如果存在,則將對應(yīng)的數(shù)組無戈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)基本定義
將每個結(jié)點(diǎn)的鄰接結(jié)點(diǎn)組成一個鏈表,鏈表的每個結(jié)點(diǎn)代表一條邊。
左邊圖只是右邊的部分表示
(2)保存方法
在鄰接表表示法中,保存一個圖同樣分為兩部分:保存頂點(diǎn)和保存邊。
頂點(diǎn)集|用一個數(shù)組表示,數(shù)組中每個元素由兩部分組成:頂點(diǎn)值和指向該頂點(diǎn)對應(yīng)的鏈
表的首地址,即:data和link兩部分。
睡由一組單鏈表表示。①非加權(quán)圖②加權(quán)圖
終止結(jié)點(diǎn)的編號后繼指針
datalink
權(quán)值終止結(jié)點(diǎn)的編號后繼指針
costdatalink
(3)有向圖和無向圖保存方法比較之處
①有向圖
每條邊都作為一個單鏈表的結(jié)點(diǎn)出現(xiàn),所以所有頂點(diǎn)對應(yīng)的單鏈表的結(jié)點(diǎn)總數(shù)=圖的邊
數(shù)
②無向圖
每條邊在鄰接表中將出現(xiàn)兩次,例如(x,y),在x的單鏈表中有一個以y為終點(diǎn)的結(jié)點(diǎn),
在y的單鏈表中有一個以x為終點(diǎn)的結(jié)點(diǎn),所以所有頂點(diǎn)對應(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{〃為了保存邊的信息,定義一個單.鏈表中的結(jié)點(diǎn)類型edgeNode
intend;〃終止結(jié)點(diǎn)的編號
TypeOfEdgeweight;〃權(quán)重
edgeNode*next;〃后繼指針
edgeNode(inte,TypeOfEdgew,edgeNode*n=NULL)
{end=e;weight=w;next=n;}
);
structverNode{〃為了保存頂點(diǎn)的*定義了一個保存頂點(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)個數(shù)中請?個存儲頂點(diǎn)的數(shù)組,并設(shè)得
個頂點(diǎn)對應(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;〃臨時指針
for(i=0;i<Vers;++i)//?次循環(huán)刪除?條單鏈表,即?個頂點(diǎn)的所有邊
while((p=verList[i].head)!=NULL){(l)
verList[i].head=p->next;(2)
deletep;③〃三步刪除一條單.鏈表中的一個結(jié)點(diǎn)
}
delete[]verList;〃釋放存儲頂點(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);〃為新插入的邊申請-~個單鏈表'I1的
結(jié)點(diǎn),然后將新插入的邊對應(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;第一個結(jié),就是要刪除的結(jié)點(diǎn)
{verList[u].head=p->next;
deletep;--Edges;
returntrue;
)
4
whil
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025餐館轉(zhuǎn)讓合同樣本
- 2024年海水淡化設(shè)備項(xiàng)目資金需求報告代可行性研究報告
- JAVA項(xiàng)目中常見設(shè)計原則與設(shè)計模式整合試題及答案
- 2024年油田工程技術(shù)服務(wù)項(xiàng)目資金需求報告代可行性研究報告
- 貨車司機(jī)安全駕駛責(zé)任合同
- 2025年中國吡喃三醇行業(yè)市場前景預(yù)測及投資價值評估分析報告
- 影視劇組攝影助理專屬合作協(xié)議
- 智能農(nóng)業(yè)殺蟲燈租賃與生態(tài)農(nóng)業(yè)示范合同
- 影視道具租賃公司場地清潔與安全維護(hù)協(xié)議
- 網(wǎng)紅燒烤品牌品牌授權(quán)與知識產(chǎn)權(quán)保護(hù)合同
- 2024-2030年全球及中國自動緊急制動系統(tǒng)(AEB)行業(yè)應(yīng)用前景及投資戰(zhàn)略研究報告
- 2025年中考?xì)v史復(fù)習(xí)試題分類匯編:中國古代史之大題(學(xué)生版)
- GB/T 19609-2024卷煙用常規(guī)分析用吸煙機(jī)測定總粒相物和焦油
- 2024年區(qū)域品牌授權(quán)協(xié)議書范文范本
- HIV陽性孕產(chǎn)婦全程管理專家共識2024年版解讀
- 施工安全的教育培訓(xùn)記錄表
- 核反應(yīng)堆熱工分析課程設(shè)計
- (正式版)SH∕T 3548-2024 石油化工涂料防腐蝕工程施工及驗(yàn)收規(guī)范
- AQ 1011-2005 煤礦在用主通風(fēng)機(jī)系統(tǒng)安全檢測檢驗(yàn)規(guī)范(正式版)
- JTS-110-10-2012水運(yùn)工程標(biāo)準(zhǔn)施工監(jiān)理招標(biāo)文件
- 2024年安徽省初中(八年級)學(xué)業(yè)水平考試初二會考生物+地理試卷真題
評論
0/150
提交評論