版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
8
2?匚
統(tǒng)
〒
料
小
苗得
制率
S東
料掘里
L
-0
〒Z
。匚
統(tǒng)“
?在線性表中,一個(gè)元素只能和其直接前驅(qū)或
接后繼相關(guān);
?在樹中,一個(gè)結(jié)點(diǎn)可以和其下一層的多個(gè)孩子
結(jié)點(diǎn)相關(guān),以及上一層的雙親結(jié)點(diǎn)相關(guān),但不
能和其他的任何結(jié)點(diǎn)直接相關(guān);
?圖(Graph)是一種較線性結(jié)枸和樹更為復(fù)雜的
數(shù)據(jù)結(jié)構(gòu)。而對亍圖來說,中任意兩個(gè)結(jié)點(diǎn)
之間都可以直接相關(guān),因此圖形結(jié)枸非常復(fù)雜
的結(jié)構(gòu)定義:
圖是由一個(gè)頂點(diǎn)集V和一個(gè)弧集E構(gòu)
的數(shù)據(jù)結(jié)構(gòu)。
Graph=(V,E)
頂點(diǎn):圖中電數(shù)據(jù)元素。設(shè)它的集合用
V(Vertex)表示。
的結(jié)構(gòu)定義:
?弧:設(shè)兩個(gè)頂點(diǎn)之間的關(guān)系的集合用E(edge)
來表示,且“,V2EV,若<vl,v2>GE,如
<vl,v2)表示從vl到v2的一條弧(Arc)。
且稱vl為弧尾(Tail)(蛤點(diǎn)、尾頂點(diǎn)),v2為
孤矣(Head)(終點(diǎn)、買頂點(diǎn)),此時(shí)W圖稱
為有向圖(Digraph)。
?無向:若<vl,v2>EE必能推導(dǎo)的<v2,vl>
GE,即E是對稱的,死/用無序?qū)V1,V2J代
替有序?qū)?表示vl和v2<間的一條①(Edge)。
此時(shí)的圖稱為元向圖(Undigraph)。
名旎1和*^誦^--當(dāng)■向E
%
由亍“弧”是有方向的,因此稱由頂點(diǎn)集和弧VA
集枸成的圖為有向圖。
例如:
Gj=(V19E)
其中,
V1={A,B,C,D,E}
V[E={vA,B>,<A,E>|
vB,C>,vC,D>,<D,B
vD,A>,<E,C>}
名詞和術(shù)語--無向
由頂點(diǎn)集和2集構(gòu)成的稱作元向
例如:G2=(V2,E)
v2={A,B,C,D,E,F}
V2E={(A,B),(A,E),
(B,E),(C,D),(D,F),
(B,F),(C,F)}
假設(shè)圖中有n個(gè)頂點(diǎn),e條邊,貝陸
含有e=n(n-l)/2條邊的無向圖稱》
完全圖;
含有e=n(n-l)條弧的有向圖稱作
有向完全圖;
弧或邊帶權(quán)的解
分別稱作有向網(wǎng)或
無向網(wǎng)。
設(shè)圖G=(Y{VE})和@
圖G=(V\{VE[),
且V'uYVE'uVE,
班核57為G的子圖。
對無向圖來說,若頂點(diǎn)v和頂點(diǎn)w之
在一條邊,則稱頂點(diǎn)V和W互為鄰接
邊(v,w)和頂點(diǎn)V和W相關(guān)聯(lián)。.
和頂點(diǎn)V關(guān)聯(lián)的邊的數(shù)目定義為邊的度。/
例如:右側(cè)圖中
ID(B)=3
ID£A)=2
對有向圖來說,由于弧有方向性,則
有入度和出度之分
頂點(diǎn)的出度:以頂點(diǎn)
V為弧尾的弧的數(shù)目:
頂點(diǎn)的入度:以頂點(diǎn)
例如:
v為弧頭的弧的數(shù)目。
OD(B)=1
ID(B)=2頂點(diǎn)的度(TD)=、
D(B)=3出度(OD)+入度(ID)
設(shè)圖G=(y{VE})中的一個(gè)頂點(diǎn)序列
{U=Vi,O,Vi,l,…,”,m=w}中,(Vi,j"Vi,j)eVlEq
則稱從頂點(diǎn)U到頂點(diǎn)W之間存在一條路徑。
路徑上邊的數(shù)目稱作路徑長度。
及口:從A到F長度為3
簡單路徑:指序列中頂(
的路徑{A,B,C,F}點(diǎn)不重復(fù)出現(xiàn)的路徑。\
簡單回路:指序歹U中
第一個(gè)頂點(diǎn)和最后一
個(gè)頂點(diǎn)相同的路徑。
若圖G中任意兩個(gè)頂
點(diǎn)之間都有路徑相通,
則稱此圖為連通圖;
若無向圖為非連通圖
則圖中各個(gè)極大連通
子圖稱作此圖的連通
分量。
對有向圖,若任意兩個(gè)頂點(diǎn)之間都》
一條有向路徑,則稱此有向圖為強(qiáng)連通
否則,其各個(gè)強(qiáng)連通子圖稱作它的
強(qiáng)連通分量。
假設(shè)一個(gè)連通圖有n個(gè)頂點(diǎn)和e條g
其中n?l條邊和n個(gè)頂點(diǎn)構(gòu)成一個(gè)極、
連通子圖,稱該極小連通子圖為此連通
的生成樹。
7.2圖的存儲表示V
一、圖的數(shù)組(鄰接矩陣)存儲表示
二、圖的鄰接表存儲表示
三、有向圖的十字鏈表存儲表示
,無向圖的鄰接多重表存儲表示
一、圖的數(shù)組(鄰接矩陣)存儲聲
定義:矩陣的元素為
_r0(i,j)^VE
A1(1(i,j)eVE
010010
100010
000101
001001
110000
011100
有向圖的鄰接矩陣
為非對稱矩陣
typedefintVertexType;〃是頂點(diǎn)關(guān)系類
VertexTypeVerList[MaxVertexNum];
intAdjMatrix[MaxVertexNum]
[MaxVertexNum];
〃對無權(quán)圖,用1或0表示相鄰否;
〃對帶權(quán)圖,則為權(quán)值類型。
二、圖的鄰接表
存儲表示
4/\
45
56
5F
1八
27人
有向圖的鄰接表
0
1
可見,在有向圖的2
鄰接表中不易找到3
頂點(diǎn)的弧4
有向圖的逆鄰接表
在有向圖的鄰接表
中,對每個(gè)頂點(diǎn),
0
鏈接的是指向該頂
1
點(diǎn)的弧
2
3
4
弧的結(jié)點(diǎn)結(jié)構(gòu)adjvexnextarcinfo
typedefstructArcNode{
intadjvex;//該弧所指向的頂點(diǎn)的位
structArcNode^nextarc;
〃指向下一條弧的指針
InfbType*info;//該弧相關(guān)信息的指針
頂點(diǎn)的結(jié)點(diǎn)結(jié)構(gòu)datafirstarc
typedefstructVNode{
VertexTypedata;〃頂點(diǎn)信息
ArcNode^firstarc;
〃指向第一條依附該頂點(diǎn)的弧J
}VNode,AdjList[MAX_VERTEX_NUM];\
圖的結(jié)構(gòu)定義(鄰接表)
typedefstruct{
AdjListvertices;
intvexnum,arcnum;
intkind;//圖的種類標(biāo)志(
Graph;
三、有向圖的十字鏈表存儲表7
0
1
02AA
弧的結(jié)點(diǎn)結(jié)構(gòu)
tailvexheadvexhlinktlinkinfo
弧尾頂點(diǎn)位置弧頭頂點(diǎn)位置弧的相關(guān)信息
指向下一個(gè)指向下一個(gè)
有相同弧頭有相同弧尾
的結(jié)點(diǎn)的結(jié)點(diǎn)
typedefstructArcBox{//弧的結(jié)構(gòu)表示
inttailvex,headvex;InfbType*infb;
才永面說ArcBoxhlink,*tlink;
VexNode;
頂點(diǎn)的結(jié)點(diǎn)結(jié)構(gòu)
datafirstinfirstout
頂點(diǎn)信息數(shù)據(jù)
指向該頂點(diǎn)的指向該頂點(diǎn)的
第一條入弧第一條出弧
typedefstructVexNode{〃頂點(diǎn)的結(jié)構(gòu)表示
VertexTypedata;(
ArcBox^firstin,^firstout;,
ode;
有向圖的結(jié)構(gòu)表示(十字鏈表)Z
typedefstruct{Q
VexNodexlist[MAX_VERTEX_NUM]i
〃頂點(diǎn)結(jié)點(diǎn)(表頭向量),
intvexnum,arcnum;
〃有向圖的當(dāng)前頂點(diǎn)數(shù)和弧數(shù)
Eaph;
7.3圖的遍歷
從圖中某個(gè)頂點(diǎn)出發(fā)游歷圖,訪w
圖中其余頂點(diǎn),并且使圖中的每個(gè)頂點(diǎn)J
僅被訪問一次的過程。
深度優(yōu)先搜索
令廣度優(yōu)先搜索
令遍歷應(yīng)用舉例
一、深度優(yōu)先搜索遍歷圖
連通圖的深度優(yōu)先搜索遍歷
從圖中某個(gè)頂點(diǎn)V。出發(fā),訪問此頂\
點(diǎn),然后依次從V。的各個(gè)未被訪問的鄰(
接點(diǎn)出發(fā)深度優(yōu)先搜索遍歷圖,直至圖中,
所西和V。有路徑相通的頂點(diǎn)都被訪問到。)
W「W2和W3均淘
鄰接點(diǎn),SGi、SG、
SG3分別為含頂點(diǎn)W
W2和W3的子圖。
訪問頂點(diǎn)V;
for(Wj>W2、W3)
若該鄰接點(diǎn)W未被訪問,
則從它出發(fā)進(jìn)行深度優(yōu)先搜索遍歷。
從上頁的圖解可見:q
1.從深度優(yōu)先搜索遍歷連通圖的過q
程類似于樹的先根遍歷;,
2.如何判別V的鄰接點(diǎn)是否被訪問?\
解決的辦法是:為每個(gè)頂點(diǎn)設(shè)立一個(gè),
劣問標(biāo)志visited[w]^^;\
voidDFS(GraphG,intv){、
〃從頂點(diǎn)v出發(fā),深度優(yōu)先搜索遍歷連通圖
visited[v]=TRUE;VisitFunc(v);
for(w=FirstAdjVex(G,v);
w!=0;w=NextAdjVex(G,v,w))
if(!visited[w])DFS(G,w);
//對v的尚未訪問的鄰接頂點(diǎn)w
4一〃遞歸調(diào)用DFS
FS
,非連通圖的深度優(yōu)先搜索遍歷個(gè)
首先將圖中每個(gè)頂點(diǎn)的訪問標(biāo)志設(shè)
為FALSE,之后搜索圖中每個(gè)頂點(diǎn),如
果未被訪問,則以該頂點(diǎn)為起始點(diǎn),進(jìn)
行深度優(yōu)先搜索遍歷,否則繼續(xù)檢查下
voidDFSTraverse(GraphG,
Status(*Visit)(intv)){
〃對圖G作深度優(yōu)先遍歷。
VisitFunc=Visit;
for(v=0;v<G.vexnum;++v)
visited[v]=FALSE;〃訪問標(biāo)志數(shù)組初始化
for(v=0;v<G.vexnum;++v)
if(!visited[v])DFS(G,v);
〃對尚未訪問的頂點(diǎn)調(diào)用DFS
二、廣度優(yōu)先搜索遍歷圖戈
對連通圖,從起始點(diǎn)V到真
各頂點(diǎn)必定存在路徑。
其中
V->w19V->w2?V->w8\
的路徑長度為1;(
V->w7,V->w3,V->w5)
的路徑長度為2;(
V->w6?V->w4C
的路徑長度為3。)
從圖中的某個(gè)頂點(diǎn)V。出發(fā),并在訪雕
頂點(diǎn)之后依次訪問V。的所有未被訪問遹
鄰接點(diǎn),之后按這些頂點(diǎn)被訪問的先后想
序依次訪問它們的鄰接點(diǎn),直至圖中所有(
和V。有路徑相通的頂點(diǎn)都被訪問到。
若此時(shí)圖中尚有頂點(diǎn)未被訪問,則另選圖
中一個(gè)未曾被訪問的頂點(diǎn)作起始點(diǎn),重虱
上述過程,直至圖中所有頂點(diǎn)都被訪問到《
O
voidBFSTraverse(GraphG,
Status(*Visit)(intW
for(v=0;v<G.vexnum;++v)、
visited[v]=FALSE;〃初始化訪問標(biāo)志
InitQueue(Q);//置空的輔助隊(duì)列Q
for(v=0;v<G.vexnum;++v)
if(!visited[v]){〃v尚未訪問
FSTraverse
visited[v]=TRUE;Visit(v);//訪問u
EnQueue(Q5v);〃v入隊(duì)列
while(!QueueEmpty(Q)){
DeQueue(Q,u);
〃隊(duì)頭元素出隊(duì)并置為u
for(w=FirstAdjVex(G,u);w!=0;
w=NextAdjVex(G必w))
if(!visited[w]){
visited[w]=TRUE;Visit(w);
EnQueue(Q5w);//訪問的頂點(diǎn)w入隊(duì)列
f
hile◎
7.4最小生成樹
問題:
假設(shè)要在n個(gè)城市之間建立通訊
聯(lián)絡(luò)網(wǎng),則連通〃個(gè)城市只需要修建
條線路,如何在最節(jié)省經(jīng)費(fèi)的前
寂E建立這個(gè)通訊網(wǎng)?
■
該問題等價(jià)于:
構(gòu)造網(wǎng)的一棵最小生成樹)即:
在e條帶權(quán)的邊中選取n-1條邊(不構(gòu)成N
回路),使“權(quán)值之和”為最小。/
笆|3法一:(普里姆算法)
二:(克魯斯卡爾算法)
普里姆算法的基本思想:
取圖中任意一個(gè)頂點(diǎn)v作為生成樹的
之后往生成樹上添加新的頂點(diǎn)W。在添加)
的頂點(diǎn)W和已經(jīng)在生成樹上的頂點(diǎn)V之間\
必定存在一條邊,并且該邊的權(quán)值在所有
連通頂點(diǎn)V和W之間的邊中取值最小。之/
后繼續(xù)往生成樹上添加頂點(diǎn),直至生成樹
n-1個(gè)頂點(diǎn)為止。
例如:
7
3
1
14+8+3+5+16+21=6
一般情況下所添加的頂點(diǎn)應(yīng)滿足飛則
條件:在生成樹的構(gòu)造過程中,圖中
頂點(diǎn)分屬兩個(gè)集合:已落在生成樹上的
頂點(diǎn)集U和尚未落在生成樹上的頂點(diǎn)煤
V-U,則應(yīng)在所有連通U中頂點(diǎn)和v-uq
頂點(diǎn)的邊中選取權(quán)值最小的邊。
V-U
設(shè)置一個(gè)輔助數(shù)組,對當(dāng)前v-2
中的每個(gè)頂點(diǎn),記錄和頂點(diǎn)集U中頂
相連接的代價(jià)最小的邊:
struct{
VertexTypeadjvex;〃11集中的頂點(diǎn)序號
VRTypelowcost;//邊的權(quán)值(
}j^dge[MAXVERTEXNUM];?
例如:19mm148
195712m
m53mm
18m73821
?271412m8m16J
mmm21m2
18mmm1627
^losedg^\0123456
Adjvexc1d1ea1de
5,
514211£
voidMiniSpanTree_P(MGraphG,VertexType
〃用普里姆算法從頂點(diǎn)u出發(fā)構(gòu)造網(wǎng)G的最小樹
k=LocateVex(G,u);&
for(j=0;j<G.vexnum;++j)//輔助數(shù)組初始夕
if(j!=k)\
closedge[j]={u,G.arcs[k][j].adj};C
closedge[k].lowcost=0;//初始,U={u}J
for(i=0;i<G.vexnum;++i){
向生成樹上添加頂點(diǎn);
k=minimum(closedge);
//求出加入生成樹的下一個(gè)頂點(diǎn)(k)
printf(closedge[k].adjvex5G.vexs[k]);
〃輸出生成樹上一條邊
closedge[k].lowcost=0;//第k頂點(diǎn)并入U(xiǎn)集
for(j=0;j<G.vexnum;+±j)
〃修改其它頂點(diǎn)的最小邊
if(G.arcsfk][j].adj<closedge[j].lowcost)
ge[j]={G.vexs[kl,G.arcs[k][j].adjV
向
克魯斯卡爾算法的基本思想:
考慮問題的出發(fā)點(diǎn):為使生成樹上邊的陽
值之和達(dá)到最小,則應(yīng)使生成樹中每一索
邊的權(quán)值盡可能地小。
具體做法:先構(gòu)造一個(gè)只含11個(gè)頂點(diǎn)的子區(qū)
SG,然后從權(quán)值最小的邊開始,若它的添?
力梵練SG中產(chǎn)生回路,則在SG上加上這
如此重復(fù))直至加上n-1條邊為止。
例如:
1
算法描述:
構(gòu)造非連通圖ST=(V,{});
k=i=0;〃k計(jì)選中的邊數(shù)
while(k<n-l){
卜+i;
檢查邊集E中第i條權(quán)值最小的邊(u,v);
若(u,v)加入ST后不使ST中產(chǎn)生回路,
刨瀚出邊(u,v);且k++;
比較兩種算法
算法名普里姆算法克魯斯卡爾算;
時(shí)間復(fù)雜度O(n2)O(eloge)
適應(yīng)范圍稠密圖稀疏圖
7.5兩點(diǎn)之間的
最短路徑問題
?求從某個(gè)源點(diǎn)到其余各點(diǎn)的最
短路徑
?每一對頂點(diǎn)之間的最短路徑
求從源點(diǎn)到其余各點(diǎn)的最短路
的算法的基本思想:
依最短路徑的長度遞增的次序求得
各條路徑
其中,從源點(diǎn)到I
頂點(diǎn)V的最短路專
源點(diǎn)是所有最短路徑,
中長度最短者。(
?路徑長度最短的最短路徑的特點(diǎn):?
在這條路徑上,必定只含一條弧,W塌
這條弧的權(quán)值最小。
■下一條路徑長度次短的最短路徑的特點(diǎn):
它只可能有兩種情況:或者是直接從源點(diǎn)
到該點(diǎn)(只含一條弧);或者是,從源點(diǎn)經(jīng)(
再到達(dá)該頂點(diǎn)(由兩條弧組成)1
.再下一條路徑長度次短的最短路徑瞰點(diǎn)
它可能有三種情況:或者是,直接從期、
到該點(diǎn)(只含一條弧);或者是,從源點(diǎn)a
頂點(diǎn)V1,再到達(dá)該頂點(diǎn)(由兩條弧組成);4
者是,從源點(diǎn)經(jīng)過頂點(diǎn)V2,再到達(dá)該頂點(diǎn))
?其余最短路徑的特點(diǎn):)
它或者是直接從源點(diǎn)到該點(diǎn)(只哈一條(
布渾D或者是,從源點(diǎn)經(jīng)過已求得最短路(
頂點(diǎn),再到達(dá)該頂點(diǎn)。)
求最短路徑的迪杰斯特拉算法:R
設(shè)置輔助數(shù)組Dist,其中每個(gè)分量
表示當(dāng)前所求得的從源點(diǎn)到其余各頂點(diǎn)篇
的最短路徑。,
一般情況下,)
Dist[k]=<源點(diǎn)到頂點(diǎn)k的弧上的權(quán)值》)
或者=<源點(diǎn)到其它頂點(diǎn)的路徑長度〉,
其它頂點(diǎn)到頂點(diǎn)k的弧上的權(quán)值>>
1)在所有從源點(diǎn)出發(fā)的弧中選取一條
值最小的弧,即為第一條最短路徑。
G.arcs[vO][^]VO和k之間存在濯
Di
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版拆遷安置房產(chǎn)權(quán)分割及交易協(xié)議4篇
- 專業(yè)平面視覺創(chuàng)作協(xié)議版
- 2025年度文化展覽場地租賃保證金三方執(zhí)行協(xié)議4篇
- 專業(yè)樹木銷售協(xié)議2024年版細(xì)化范本版A版
- 2025年度高端醫(yī)療設(shè)備采購合同模板4篇
- 2025年度拆遷項(xiàng)目資金監(jiān)管與居間服務(wù)協(xié)議4篇
- 二零二五年度農(nóng)家樂合伙人合作協(xié)議3篇
- 2025年廠區(qū)公共區(qū)域清潔與物業(yè)管理合作協(xié)議范本4篇
- 2025年度商業(yè)綜合體室內(nèi)外裝修一體化合同4篇
- 專業(yè)羽毛球場租借合同(2024年)版B版
- 2023社會(huì)責(zé)任報(bào)告培訓(xùn)講稿
- 2023核電廠常規(guī)島及輔助配套設(shè)施建設(shè)施工技術(shù)規(guī)范 第8部分 保溫及油漆
- 2025年蛇年春聯(lián)帶橫批-蛇年對聯(lián)大全新春對聯(lián)集錦
- 表B. 0 .11工程款支付報(bào)審表
- 警務(wù)航空無人機(jī)考試題庫及答案
- 空氣自動(dòng)站儀器運(yùn)營維護(hù)項(xiàng)目操作說明以及簡單故障處理
- 新生兒窒息復(fù)蘇正壓通氣課件
- 法律顧問投標(biāo)書
- 班主任培訓(xùn)簡報(bào)4篇(一)
- 成都市數(shù)學(xué)八年級上冊期末試卷含答案
- T-CHSA 020-2023 上頜骨缺損手術(shù)功能修復(fù)重建的專家共識
評論
0/150
提交評論