數(shù)據(jù)結(jié)構(gòu)課件第七章圖_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課件第七章圖_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課件第七章圖_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課件第七章圖_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課件第七章圖_第5頁(yè)
已閱讀5頁(yè),還剩95頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)結(jié)構(gòu)課件第七章圖第一頁(yè),共一百頁(yè),2022年,8月28日

圖是由一個(gè)頂點(diǎn)集V和一個(gè)弧集R構(gòu)成的數(shù)據(jù)結(jié)構(gòu)。Graph=(V,R)其中,R={<v,w>|v,w∈V且P(v,w)}

<v,w>表示從v到w的一條弧,并稱(chēng)v為弧頭,w為弧尾。

圖的結(jié)構(gòu)定義:VW第二頁(yè),共一百頁(yè),2022年,8月28日

由于“弧”是有方向的,因此稱(chēng)由頂點(diǎn)集和弧集構(gòu)成的圖為有向圖。

ABECD例如:G1=(V1,VR1)其中V1={A,B,C,D,E}VR1={<A,B>,<A,E>,<B,C>,<C,D>,<D,B>,<D,A>,<E,C>}第三頁(yè),共一百頁(yè),2022年,8月28日若<v,w>VR

必有<w,v>VR,則稱(chēng)(v,w)為頂點(diǎn)v和頂點(diǎn)w之間存在一條邊。

BCADFE由頂點(diǎn)集和邊集構(gòu)成的圖稱(chēng)作無(wú)向圖。例如:G2=(V2,VR2)V2={A,B,C,D,E,F}VR2={(A,B),(A,E),(B,E),(C,D),(D,F),(B,F),(C,F)}第四頁(yè),共一百頁(yè),2022年,8月28日名詞和術(shù)語(yǔ)網(wǎng)、子圖

完全圖、稀疏圖、稠密圖鄰接點(diǎn)、度、入度、出度路徑、路徑長(zhǎng)度、簡(jiǎn)單路徑、簡(jiǎn)單回路連通圖、連通分量、強(qiáng)連通圖、強(qiáng)連通分量生成樹(shù)、生成森林第五頁(yè),共一百頁(yè),2022年,8月28日ABECFAEABBC設(shè)圖G=(V,{VR})和圖

G=(V,{VR}),且

VV,VRVR,則稱(chēng)

G為G的子圖。1597211132

弧或邊帶權(quán)的圖分別稱(chēng)作有向網(wǎng)或無(wú)向網(wǎng)。第六頁(yè),共一百頁(yè),2022年,8月28日假設(shè)圖中有

n

個(gè)頂點(diǎn),e

條邊,則

含有e=n(n-1)/2條邊的無(wú)向圖稱(chēng)作完全圖;

含有e=n(n-1)條弧的有向圖稱(chēng)作

有向完全圖;若邊或弧的個(gè)數(shù)e<nlogn,則稱(chēng)作稀疏圖,否則稱(chēng)作稠密圖。第七頁(yè),共一百頁(yè),2022年,8月28日

假若頂點(diǎn)v和頂點(diǎn)w之間存在一條邊,則稱(chēng)頂點(diǎn)v

和w

互為鄰接點(diǎn),ACDFE例如:ID(B)=3ID(A)=2邊(v,w)

和頂點(diǎn)v和w

相關(guān)聯(lián)。

和頂點(diǎn)v關(guān)聯(lián)的邊的數(shù)目定義為頂點(diǎn)v的度。B第八頁(yè),共一百頁(yè),2022年,8月28日頂點(diǎn)的出度:以頂點(diǎn)v為弧尾的弧的數(shù)目;ABECF對(duì)有向圖來(lái)說(shuō),頂點(diǎn)的入度:以頂點(diǎn)v為弧頭的弧的數(shù)目。頂點(diǎn)的度(TD)=出度(OD)+入度(ID)例如:ID(B)=2OD(B)=1TD(B)=3第九頁(yè),共一百頁(yè),2022年,8月28日設(shè)圖G=(V,{VR})中的一個(gè)頂點(diǎn)序列{u=vi,0,vi,1,…,vi,m=w}中,(vi,j-1,vi,j)VR1≤j≤m,則稱(chēng)從頂點(diǎn)u到頂點(diǎn)w之間存在一條路徑。路徑上邊的數(shù)目稱(chēng)作路徑長(zhǎng)度。ABECF如:長(zhǎng)度為3的路徑{A,B,C,F}簡(jiǎn)單路徑:序列中頂點(diǎn)不重復(fù)出現(xiàn)的路徑。簡(jiǎn)單回路:序列中第一個(gè)頂點(diǎn)和最后一個(gè)頂點(diǎn)相同的路徑。第十頁(yè),共一百頁(yè),2022年,8月28日若圖G中任意兩個(gè)頂點(diǎn)之間都有路徑相通,則稱(chēng)此圖為連通圖;若無(wú)向圖為非連通圖,則圖中各個(gè)極大連通子圖稱(chēng)作此圖的連通分量。BACDFEBACDFE第十一頁(yè),共一百頁(yè),2022年,8月28日

若任意兩個(gè)頂點(diǎn)之間都存在一條有向路徑,則稱(chēng)此有向圖為強(qiáng)連通圖。ABECFABECF對(duì)有向圖,否則,其各個(gè)強(qiáng)連通子圖稱(chēng)作它的強(qiáng)連通分量。第十二頁(yè),共一百頁(yè),2022年,8月28日

假設(shè)一個(gè)連通圖有n個(gè)頂點(diǎn)和e條邊,其中n-1條邊和n個(gè)頂點(diǎn)構(gòu)成一個(gè)極小連通子圖,稱(chēng)該極小連通子圖為此連通圖的生成樹(shù)。對(duì)非連通圖,則稱(chēng)由各個(gè)連通分量的生成樹(shù)的集合為此非連通圖的生成森林。BACDFE第十三頁(yè),共一百頁(yè),2022年,8月28日結(jié)構(gòu)的建立和銷(xiāo)毀插入或刪除頂點(diǎn)對(duì)鄰接點(diǎn)的操作對(duì)頂點(diǎn)的訪(fǎng)問(wèn)操作遍歷插入和刪除弧基本操作第十四頁(yè),共一百頁(yè),2022年,8月28日CreatGraph(&G,V,VR)://按定義(V,VR)構(gòu)造圖DestroyGraph(&G)://銷(xiāo)毀圖結(jié)構(gòu)的建立和銷(xiāo)毀第十五頁(yè),共一百頁(yè),2022年,8月28日對(duì)頂點(diǎn)的訪(fǎng)問(wèn)操作LocateVex(G,u);

//若G中存在頂點(diǎn)u,則返回該頂點(diǎn)在

//圖中“位置”

;否則返回其它信息。GetVex(G,v);//返回v的值。PutVex(&G,v,value);//對(duì)v賦值value。第十六頁(yè),共一百頁(yè),2022年,8月28日對(duì)鄰接點(diǎn)的操作FirstAdjVex(G,v);

//返回v的“第一個(gè)鄰接點(diǎn)”。若該頂點(diǎn)//在G中沒(méi)有鄰接點(diǎn),則返回“空”。NextAdjVex(G,v,w);

//返回v的(相對(duì)于w的)“下一個(gè)鄰接//點(diǎn)”。若w是v的最后一個(gè)鄰接點(diǎn),則//返回“空”。第十七頁(yè),共一百頁(yè),2022年,8月28日插入或刪除頂點(diǎn)InsertVex(&G,v);

//在圖G中增添新頂點(diǎn)v。DeleteVex(&G,v);//刪除G中頂點(diǎn)v及其相關(guān)的弧。第十八頁(yè),共一百頁(yè),2022年,8月28日插入和刪除弧InsertArc(&G,v,w);//在G中增添弧<v,w>,若G是無(wú)向的,

//則還增添對(duì)稱(chēng)弧<w,v>。DeleteArc(&G,v,w);

//在G中刪除弧<v,w>,若G是無(wú)向的,

//則還刪除對(duì)稱(chēng)弧<w,v>。第十九頁(yè),共一百頁(yè),2022年,8月28日遍歷DFSTraverse(G,v,Visit());//從頂點(diǎn)v起深度優(yōu)先遍歷圖G,并對(duì)每//個(gè)頂點(diǎn)調(diào)用函數(shù)Visit一次且僅一次。BFSTraverse(G,v,Visit());

//從頂點(diǎn)v起廣度優(yōu)先遍歷圖G,并對(duì)每//個(gè)頂點(diǎn)調(diào)用函數(shù)Visit一次且僅一次。第二十頁(yè),共一百頁(yè),2022年,8月28日7.2圖的存儲(chǔ)表示一、圖的數(shù)組(鄰接矩陣)存儲(chǔ)表示二、圖的鄰接表存儲(chǔ)表示三、有向圖的十字鏈表存儲(chǔ)表示四、無(wú)向圖的鄰接多重表存儲(chǔ)表示第二十一頁(yè),共一百頁(yè),2022年,8月28日Aij={0(i,j)VR1(i,j)VR一、圖的數(shù)組(鄰接矩陣)存儲(chǔ)表示BACDFE定義:矩陣的元素為無(wú)向圖的鄰接矩陣為對(duì)稱(chēng)矩陣ABCDEFABCDEF第二十二頁(yè),共一百頁(yè),2022年,8月28日有向圖的鄰接矩陣為非對(duì)稱(chēng)矩陣ABDCEABCDEABCDE第二十三頁(yè),共一百頁(yè),2022年,8月28日鄰接矩陣表示法特點(diǎn):1)無(wú)向圖鄰接矩陣是對(duì)稱(chēng)矩陣,同一條邊表示了兩次;2)頂點(diǎn)v的度:在無(wú)向圖中等于二維數(shù)組對(duì)應(yīng)行(或列)中1的個(gè)數(shù);在有向圖中,統(tǒng)計(jì)第i行1的個(gè)數(shù)可得頂點(diǎn)i的出度,統(tǒng)計(jì)第j列1的個(gè)數(shù)可得頂點(diǎn)j的入度。3)判斷兩頂點(diǎn)v、u是否為鄰接點(diǎn):只需判二維數(shù)組對(duì)應(yīng)分量是否為1;4)頂點(diǎn)不變,在圖中增加、刪除邊:只需對(duì)二維數(shù)組對(duì)應(yīng)分量賦值1或清0;5)設(shè)存儲(chǔ)頂點(diǎn)的一維數(shù)組大小為n(圖的頂點(diǎn)數(shù)n),G占用存儲(chǔ)空間:n+n2;G占用存儲(chǔ)空間只與它的頂點(diǎn)數(shù)有關(guān),與邊數(shù)無(wú)關(guān);適用于邊稠密的圖;第二十四頁(yè),共一百頁(yè),2022年,8月28日typedefstructArcCell{//弧的定義

VRTypeadj;//VRType是頂點(diǎn)關(guān)系類(lèi)型

//對(duì)無(wú)權(quán)圖,用1或0表示相鄰否;

//對(duì)帶權(quán)圖,則為權(quán)值類(lèi)型。

InfoType*info;//該弧相關(guān)信息的指針}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];第二十五頁(yè),共一百頁(yè),2022年,8月28日typedefstruct{//圖的定義

VertexType//頂點(diǎn)信息

vexs[MAX_VERTEX_NUM];AdjMatrixarcs;//弧的信息

intvexnum,arcnum;//頂點(diǎn)數(shù),弧數(shù)

GraphKindkind;//圖的種類(lèi)標(biāo)志

}MGraph;第二十六頁(yè),共一百頁(yè),2022年,8月28日網(wǎng)絡(luò)的鄰接矩陣ABDCE1597211132第二十七頁(yè),共一百頁(yè),2022年,8月28日0A141B0452C353D254E015F123BACDFE二、圖的鄰接表存儲(chǔ)表示

同一個(gè)頂點(diǎn)發(fā)出的邊鏈接在同一個(gè)邊鏈表中,每一個(gè)鏈結(jié)點(diǎn)代表一條邊(邊結(jié)點(diǎn)),結(jié)點(diǎn)中有另一頂點(diǎn)的下標(biāo)adjvex

和指針nextedge。第二十八頁(yè),共一百頁(yè),2022年,8月28日142301201234

ABCDE有向圖的鄰接表ABECD可見(jiàn),在有向圖的鄰接表中不易找到指向該頂點(diǎn)的弧。第二十九頁(yè),共一百頁(yè),2022年,8月28日ABECD有向圖的逆鄰接表ABCDE30342001234在有向圖的鄰接表中,對(duì)每個(gè)頂點(diǎn),鏈接的是指向該頂點(diǎn)的弧。第三十頁(yè),共一百頁(yè),2022年,8月28日鄰接表表示法特點(diǎn):1)無(wú)向圖鄰接表邊結(jié)點(diǎn)數(shù)是邊數(shù)的兩倍.2)頂點(diǎn)vi的度:在無(wú)向圖中等于第i個(gè)鏈表中的結(jié)點(diǎn)數(shù);在有向圖鄰接表中,第i行的結(jié)點(diǎn)數(shù)等于頂點(diǎn)i的出度,在有向圖逆鄰接表中,第i行的結(jié)點(diǎn)數(shù)等于頂點(diǎn)i的入度。3)在鄰接表上容易找到任一頂點(diǎn)的第一個(gè)鄰接點(diǎn)和下一個(gè)鄰接點(diǎn)4)設(shè)存儲(chǔ)頂點(diǎn)的一維數(shù)組大小為n(圖的頂點(diǎn)數(shù)n),G占用存儲(chǔ)空間:n+e;G占用存儲(chǔ)空間與它的頂點(diǎn)數(shù)和邊數(shù)有關(guān);適用于邊稀疏的圖;第三十一頁(yè),共一百頁(yè),2022年,8月28日typedefstructArcNode{

intadjvex;//該弧所指向的頂點(diǎn)的位置

structArcNode*nextarc;//指向下一條弧的指針

InfoType*info;//該弧相關(guān)信息的指針}ArcNode;adjvexnextarcinfo弧的結(jié)點(diǎn)結(jié)構(gòu)第三十二頁(yè),共一百頁(yè),2022年,8月28日typedefstructVNode{

VertexTypedata;//頂點(diǎn)信息

ArcNode*firstarc;//指向第一條依附該頂點(diǎn)的弧

}VNode,AdjList[MAX_VERTEX_NUM];

datafirstarc頂點(diǎn)的結(jié)點(diǎn)結(jié)構(gòu)第三十三頁(yè),共一百頁(yè),2022年,8月28日typedefstruct{

AdjListvertices;

intvexnum,arcnum;

intkind;//圖的種類(lèi)標(biāo)志

}ALGraph;圖的結(jié)構(gòu)定義第三十四頁(yè),共一百頁(yè),2022年,8月28日三、有向圖的十字鏈表存儲(chǔ)表示

弧的結(jié)點(diǎn)結(jié)構(gòu)弧尾頂點(diǎn)位置弧頭頂點(diǎn)位置弧的相關(guān)信息指向下一個(gè)有相同弧尾的結(jié)點(diǎn)指向下一個(gè)有相同弧頭的結(jié)點(diǎn)typedefstructArcBox{//弧的結(jié)構(gòu)表示

inttailvex,headvex;InfoType*info;structArcBox*hlink,*tlink;

}VexNode;第三十五頁(yè),共一百頁(yè),2022年,8月28日頂點(diǎn)的結(jié)點(diǎn)結(jié)構(gòu)頂點(diǎn)信息數(shù)據(jù)指向該頂點(diǎn)的第一條入弧指向該頂點(diǎn)的第一條出弧typedefstructVexNode{//頂點(diǎn)的結(jié)構(gòu)表示

VertexTypedata;ArcBox*firstin,*firstout;}VexNode;第三十六頁(yè),共一百頁(yè),2022年,8月28日typedefstruct{VexNodexlist[MAX_VERTEX_NUM];//頂點(diǎn)結(jié)點(diǎn)(表頭向量)

intvexnum,arcnum;//有向圖的當(dāng)前頂點(diǎn)數(shù)和弧數(shù)}OLGraph;有向圖的結(jié)構(gòu)表示(十字鏈表)第三十七頁(yè),共一百頁(yè),2022年,8月28日ABCDABCD010220233031320123第三十八頁(yè),共一百頁(yè),2022年,8月28日四、無(wú)向圖的鄰接多重表存儲(chǔ)表示typedefstructEbox{VisitIfmark;//訪(fǎng)問(wèn)標(biāo)記

intivex,jvex;//該邊依附的兩個(gè)頂點(diǎn)的位置

structEBox*ilink,*jlink;InfoType*info;//該邊信息指針}EBox;邊的結(jié)構(gòu)表示第三十九頁(yè),共一百頁(yè),2022年,8月28日typedefstruct{//鄰接多重表

VexBoxadjmulist[MAX_VERTEX_NUM];

intvexnum,edgenum;

}AMLGraph;頂點(diǎn)的結(jié)構(gòu)表示typedefstructVexBox{VertexTypedata;EBox*firstedge;//指向第一條依附該頂點(diǎn)的邊}VexBox;無(wú)向圖的結(jié)構(gòu)表示第四十頁(yè),共一百頁(yè),2022年,8月28日ABCDE01234ABCDE010321232441第四十一頁(yè),共一百頁(yè),2022年,8月28日7.3圖的遍歷

從圖中某個(gè)頂點(diǎn)出發(fā)游歷圖,訪(fǎng)遍圖中其余頂點(diǎn),并且使圖中的每個(gè)頂點(diǎn)僅被訪(fǎng)問(wèn)一次的過(guò)程。深度優(yōu)先搜索廣度優(yōu)先搜索遍歷應(yīng)用舉例第四十二頁(yè),共一百頁(yè),2022年,8月28日

從圖中某個(gè)頂點(diǎn)V0出發(fā),訪(fǎng)問(wèn)此頂點(diǎn),然后依次從V0的各個(gè)未被訪(fǎng)問(wèn)的鄰接點(diǎn)出發(fā)深度優(yōu)先搜索遍歷圖,直至圖中所有和V0有路徑相通的頂點(diǎn)都被訪(fǎng)問(wèn)到。一、深度優(yōu)先搜索遍歷圖連通圖的深度優(yōu)先搜索遍歷第四十三頁(yè),共一百頁(yè),2022年,8月28日Vw1SG1SG2SG3W1、W2和W3

均為V的鄰接點(diǎn),SG1、SG2和SG3分別為含頂點(diǎn)W1、W2和W3

的子圖。訪(fǎng)問(wèn)頂點(diǎn)V:for(W1、W2、W3)

若該鄰接點(diǎn)W未被訪(fǎng)問(wèn),

則從它出發(fā)進(jìn)行深度優(yōu)先搜索遍歷。w2w3w2第四十四頁(yè),共一百頁(yè),2022年,8月28日從上頁(yè)的圖解可見(jiàn):1.從深度優(yōu)先搜索遍歷連通圖的過(guò)程類(lèi)似于樹(shù)的先根遍歷;解決的辦法是:為每個(gè)頂點(diǎn)設(shè)立一個(gè)“訪(fǎng)問(wèn)標(biāo)志visited[w]”。2.如何判別V的鄰接點(diǎn)是否被訪(fǎng)問(wèn)?第四十五頁(yè),共一百頁(yè),2022年,8月28日acbdegfFFFFFFFTTTTTTTacbdgfeacbgfed訪(fǎng)問(wèn)標(biāo)志:訪(fǎng)問(wèn)次序:例如:01234560234516第四十六頁(yè),共一百頁(yè),2022年,8月28日voidDFS(GraphG,intv){//從頂點(diǎn)v出發(fā),深度優(yōu)先搜索遍歷連通圖Gvisited[v]=TRUE;VisitFunc(v);

for(w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w))

if(!visited[w])DFS(G,w);

//對(duì)v的尚未訪(fǎng)問(wèn)的鄰接頂點(diǎn)w//遞歸調(diào)用DFS}//DFS第四十七頁(yè),共一百頁(yè),2022年,8月28日首先將圖中每個(gè)頂點(diǎn)的訪(fǎng)問(wèn)標(biāo)志設(shè)為FALSE,之后搜索圖中每個(gè)頂點(diǎn),如果未被訪(fǎng)問(wèn),則以該頂點(diǎn)為起始點(diǎn),進(jìn)行深度優(yōu)先搜索遍歷,否則繼續(xù)檢查下一頂點(diǎn)。非連通圖的深度優(yōu)先搜索遍歷第四十八頁(yè),共一百頁(yè),2022年,8月28日abchdekfgFFFFFFFFFTTTTTTTTTachdkfebgachkfedbg訪(fǎng)問(wèn)標(biāo)志:訪(fǎng)問(wèn)次序:例如:012345678021345678第四十九頁(yè),共一百頁(yè),2022年,8月28日voidDFSTraverse(GraphG,

Status(*Visit)(intv)){

//對(duì)圖G作深度優(yōu)先遍歷。

VisitFunc=Visit;

for(v=0;v<G.vexnum;++v)visited[v]=FALSE;//訪(fǎng)問(wèn)標(biāo)志數(shù)組初始化

for(v=0;v<G.vexnum;++v)

if(!visited[v])DFS(G,v);//對(duì)尚未訪(fǎng)問(wèn)的頂點(diǎn)調(diào)用DFS}第五十頁(yè),共一百頁(yè),2022年,8月28日二、廣度優(yōu)先搜索遍歷圖Vw1w8w3w7w6w2w5w4對(duì)連通圖,從起始點(diǎn)V到其余各頂點(diǎn)必定存在路徑。其中,V->w1,V->w2,V->w8

的路徑長(zhǎng)度為1;V->w7,V->w3,V->w5

的路徑長(zhǎng)度為2;V->w6,V->w4

的路徑長(zhǎng)度為3。w1Vw2w7w6w3w8w5w4第五十一頁(yè),共一百頁(yè),2022年,8月28日從圖中的某個(gè)頂點(diǎn)V0出發(fā),并在訪(fǎng)問(wèn)此頂點(diǎn)之后依次訪(fǎng)問(wèn)V0的所有未被訪(fǎng)問(wèn)過(guò)的鄰接點(diǎn),之后分別從這些鄰接點(diǎn)出發(fā)依次訪(fǎng)問(wèn)它們的鄰接點(diǎn),并使“先被訪(fǎng)問(wèn)的頂點(diǎn)的鄰接點(diǎn)”先于“后被訪(fǎng)問(wèn)的頂點(diǎn)的鄰接點(diǎn)”被訪(fǎng)問(wèn),直至圖中所有和V0有路徑相通的頂點(diǎn)都被訪(fǎng)問(wèn)到。若此時(shí)圖中尚有頂點(diǎn)未被訪(fǎng)問(wèn),則另選圖中一個(gè)未曾被訪(fǎng)問(wèn)的頂點(diǎn)作起始點(diǎn),重復(fù)上述過(guò)程,直至圖中所有頂點(diǎn)都被訪(fǎng)問(wèn)到為止。第五十二頁(yè),共一百頁(yè),2022年,8月28日Vw1w8w3w7w6w2w5w4w1Vw2w7w6w3w8w5w4FFFFFFFFFTTTTTTTTT012345678VisitedQV訪(fǎng)問(wèn)次序:w1w2w8w4w7w3w5w6第五十三頁(yè),共一百頁(yè),2022年,8月28日

voidBFSTraverse(GraphG,

Status(*Visit)(intv)){

for(v=0;v<G.vexnum;++v)visited[v]=FALSE;//初始化訪(fǎng)問(wèn)標(biāo)志

InitQueue(Q);

//置空的輔助隊(duì)列Q

for(v=0;v<G.vexnum;++v)

if(

!visited[v]){

//v尚未訪(fǎng)問(wèn)

}

}//BFSTraverse……第五十四頁(yè),共一百頁(yè),2022年,8月28日visited[u]=TRUE;Visit(u);//訪(fǎng)問(wèn)uEnQueue(Q,v);

//v入隊(duì)列while(!QueueEmpty(Q)){

DeQueue(Q,u);//隊(duì)頭元素出隊(duì)并置為ufor(w=FirstAdjVex(G,u);w!=0;w=NextAdjVex(G,u,w))

if(!visited[w])

{

visited[w]=TRUE;Visit(w);EnQueue(Q,w);

//訪(fǎng)問(wèn)的頂點(diǎn)w入隊(duì)列

}//if}//while第五十五頁(yè),共一百頁(yè),2022年,8月28日

連通分量(Connectedcomponent)

當(dāng)無(wú)向圖為非連通圖時(shí),從圖中某一頂點(diǎn)出發(fā),利用深度優(yōu)先搜索算法或廣度優(yōu)先搜索算法不可能遍歷到圖中的所有頂點(diǎn),只能訪(fǎng)問(wèn)到該頂點(diǎn)所在的最大連通子圖(連通分量)的所有頂點(diǎn)。圖的連通性問(wèn)題LEDHGABFICJKM第五十六頁(yè),共一百頁(yè),2022年,8月28日

若從無(wú)向圖的每一個(gè)連通分量中的一個(gè)頂點(diǎn)出發(fā)進(jìn)行遍歷,可求得無(wú)向圖的所有連通分量。求連通分量的算法需要對(duì)圖的每一個(gè)頂點(diǎn)進(jìn)行檢測(cè):若已被訪(fǎng)問(wèn)過(guò),則該頂點(diǎn)一定是落在圖中已求得的連通分量上;若還未被訪(fǎng)問(wèn),則從該頂點(diǎn)出發(fā)遍歷圖,可求得圖的另一個(gè)連通分量。對(duì)于非連通的無(wú)向圖,所有連通分量的生成樹(shù)組成了非連通圖的生成森林。EDHGIKLABFCJMHGIKLABFCJMED第五十七頁(yè),共一百頁(yè),2022年,8月28日非連通無(wú)向圖DFS訪(fǎng)問(wèn)序列:ALMJBFCDEGKHILABFCJMHGIKLABFCJMEDEDHGIKHGIKLABFCJMED第五十八頁(yè),共一百頁(yè),2022年,8月28日7.4(連通網(wǎng)的)最小生成樹(shù)

假設(shè)要在n個(gè)城市之間建立通訊聯(lián)絡(luò)網(wǎng),則連通n個(gè)城市只需要修建n-1條線(xiàn)路,如何在最節(jié)省經(jīng)費(fèi)的前提下建立這個(gè)通訊網(wǎng)?問(wèn)題:第五十九頁(yè),共一百頁(yè),2022年,8月28日構(gòu)造網(wǎng)的一棵最小生成樹(shù),即:在e條帶權(quán)的邊中選取n-1條邊(不構(gòu)成回路),使“權(quán)值之和”為最小。算法二:(克魯斯卡爾算法)該問(wèn)題等價(jià)于:算法一:(普里姆算法)第六十頁(yè),共一百頁(yè),2022年,8月28日假設(shè)N={V,{E})是連通網(wǎng),TE是N上最小生成樹(shù)邊的集合。算法從U={u0}(u0∈V),TE={}開(kāi)始,重復(fù)執(zhí)行下述操作:在所有u∈V,v∈V-U的邊(u,v)∈E中找一條代價(jià)最小的邊(u0,v0)并入集合TE,同時(shí)v0并入U(xiǎn),直至U=V為止。此時(shí)TE中必有n-1條邊,則T=(V,{TE})為N的最小生成樹(shù)。普里姆算法的基本思想:第六十一頁(yè),共一百頁(yè),2022年,8月28日在生成樹(shù)的構(gòu)造過(guò)程中,圖中n個(gè)頂點(diǎn)分屬兩個(gè)集合:已落在生成樹(shù)上的頂點(diǎn)集U

和尚未落在生成樹(shù)上的頂點(diǎn)集V-U

,則應(yīng)在所有連通U中頂點(diǎn)和V-U中頂點(diǎn)的邊中選取權(quán)值最小的邊。

一般情況下所添加的頂點(diǎn)應(yīng)滿(mǎn)足下列條件:第六十二頁(yè),共一百頁(yè),2022年,8月28日abcdegf例如:195141827168213ae12dcbgf7148531621所得生成樹(shù)權(quán)值和=14+8+3+5+16+21=67第六十三頁(yè),共一百頁(yè),2022年,8月28日設(shè)置一個(gè)輔助數(shù)組,對(duì)每個(gè)頂點(diǎn),記錄從頂點(diǎn)集U到V-U具有代價(jià)最小的邊:struct{VertexTypeadjvex;//U集中的頂點(diǎn)

VRTypelowcost;//邊的權(quán)值}closedge[MAX_VERTEX_NUM];

adjvexlowcost第六十四頁(yè),共一百頁(yè),2022年,8月28日abcdegf195141827168213ae12dcb7aaa19141814e12ee8168d3dd7213c550123456U:V-U:abcdefgfg1621019∞∞14∞181905712∞∞∞503∞∞∞∞730821∞1412∞80∞16∞∞∞21∞02718∞∞∞16270abcdefgabcdefg第六十五頁(yè),共一百頁(yè),2022年,8月28日voidMiniSpanTree_P(MGraphG,VertexTypeu){//用普里姆算法從頂點(diǎn)u出發(fā)構(gòu)造網(wǎng)G的最小生成樹(shù)

k=LocateVex(G,u);

for(j=0;j<G.vexnum;++j)//輔助數(shù)組初始化

if(j!=k)

closedge[j]={u,G.arcs[k][j].adj};

closedge[k].lowcost=0;//初始,U={u}

for(i=0;i<G.vexnum;++i){}繼續(xù)向生成樹(shù)上添加頂點(diǎn);第六十六頁(yè),共一百頁(yè),2022年,8月28日

k=minimum(closedge);

//求出加入生成樹(shù)的下一個(gè)頂點(diǎn)(k)

printf(closedge[k].adjvex,G.vexs[k]);//輸出生成樹(shù)上一條邊

closedge[k].lowcost=0;//第k頂點(diǎn)并入U(xiǎn)集

for(j=0;j<G.vexnum;++j)//修改其它頂點(diǎn)的最小邊

if(G.arcs[k][j].adj<closedge[j].lowcost)closedge[j]={G.vexs[k],G.arcs[k][j].adj};

第六十七頁(yè),共一百頁(yè),2022年,8月28日具體做法:先構(gòu)造一個(gè)只含n個(gè)頂點(diǎn)的子圖SG,然后從權(quán)值最小的邊開(kāi)始,若它的添加不使SG中產(chǎn)生回路,則在SG上加上這條邊,如此重復(fù),直至加上n-1條邊為止??紤]問(wèn)題的出發(fā)點(diǎn):為使生成樹(shù)上邊的權(quán)值之和達(dá)到最小,則應(yīng)使生成樹(shù)中每一條邊的權(quán)值盡可能地小??唆斔箍査惴ǖ幕舅枷耄旱诹隧?yè),共一百頁(yè),2022年,8月28日abcdegf195141827168213ae12dcbgf7148531621例如:7121819第六十九頁(yè),共一百頁(yè),2022年,8月28日算法描述:構(gòu)造非連通圖ST=(V,{});k=i=0;//k計(jì)選中的邊數(shù)

while(k<n-1){++i;

檢查邊集E中第i條權(quán)值最小的邊(u,v);

若(u,v)加入ST后不使ST中產(chǎn)生回路,

則輸出邊(u,v);

且k++;}第七十頁(yè),共一百頁(yè),2022年,8月28日普里姆算法克魯斯卡爾算法時(shí)間復(fù)雜度O(n2)O(eloge)稠密圖稀疏圖算法名適應(yīng)范圍比較兩種算法第七十一頁(yè),共一百頁(yè),2022年,8月28日7.7拓?fù)渑判?/p>

問(wèn)題:

假設(shè)以有向圖表示一個(gè)工程的施工圖或程序的數(shù)據(jù)流圖,則圖中不允許出現(xiàn)回路。

檢查有向圖中是否存在回路的方法之一,是對(duì)有向圖進(jìn)行拓?fù)渑判颉5谄呤?yè),共一百頁(yè),2022年,8月28日何謂“拓?fù)渑判颉???duì)有向圖進(jìn)行如下操作:

按照有向圖給出的次序關(guān)系,將圖中頂點(diǎn)排成一個(gè)線(xiàn)性序列,對(duì)于有向圖中沒(méi)有限定次序關(guān)系的頂點(diǎn),則可以人為加上任意的次序關(guān)系。第七十三頁(yè),共一百頁(yè),2022年,8月28日例如:對(duì)于下列有向圖BDAC可求得拓?fù)溆行蛐蛄校?/p>

ABCD

ACBD由此所得頂點(diǎn)的線(xiàn)性序列稱(chēng)之為拓?fù)溆行蛐蛄械谄呤捻?yè),共一百頁(yè),2022年,8月28日BDAC反之,對(duì)于下列有向圖不能求得它的拓?fù)溆行蛐蛄小R驗(yàn)閳D中存在一個(gè)回路

{B,C,D}第七十五頁(yè),共一百頁(yè),2022年,8月28日如何進(jìn)行拓?fù)渑判颍恳?、從有向圖中選取一個(gè)沒(méi)有前驅(qū)的頂點(diǎn),并輸出之;

重復(fù)上述兩步,直至圖空,或者圖不空但找不到無(wú)前驅(qū)的頂點(diǎn)為止。二、從有向圖中刪去此頂點(diǎn)以及所

有以它為尾的??;第七十六頁(yè),共一百頁(yè),2022年,8月28日abcghdfeabhcdgfe在算法中需要用定量的描述替代定性的概念

沒(méi)有前驅(qū)的頂點(diǎn)入度為零的頂點(diǎn)刪除頂點(diǎn)及以它為尾的弧弧頭頂點(diǎn)的入度減1第七十七頁(yè),共一百頁(yè),2022年,8月28日abcghdfe01234567abcdefgh266734645500112231indegree01234567sab輸出次序:b02hh1a01ccd0dgfe000第七十八頁(yè),共一百頁(yè),2022年,8月28日算法描述StatusTopologicalsort(ALGraphG){

FindinDegree(G,indegree);InitStack(s)

For(i=0;i<G.vexnum;++i)if(!indegree[i])push(s,i);Count=0;

While(!StackEmpty(s)){pop(s,i);printf(i,G.vertices[i].data);++count;for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;if(!(--indegree[k]))push(s,k);}}

if(count<g.vexnum)returnERROR;}第七十九頁(yè),共一百頁(yè),2022年,8月28日7.8關(guān)鍵路徑問(wèn)題:

假設(shè)以有向網(wǎng)表示一個(gè)施工流圖,弧上的權(quán)值表示完成該項(xiàng)子工程所需時(shí)間。問(wèn):哪些子工程項(xiàng)是“關(guān)鍵工程”?即:哪些子工程項(xiàng)將影響整個(gè)工程的完成期限的。第八十頁(yè),共一百頁(yè),2022年,8月28日abcdefghk64521187244例如:“關(guān)鍵活動(dòng)”指的是:該弧上的權(quán)值增加

將使有向圖上的最長(zhǎng)路徑的長(zhǎng)度增加。整個(gè)工程完成的時(shí)間為:從有向圖的源點(diǎn)到匯點(diǎn)的最長(zhǎng)路徑。源點(diǎn)匯點(diǎn)6174第八十一頁(yè),共一百頁(yè),2022年,8月28日

如何求關(guān)鍵活動(dòng)?“事件(頂點(diǎn))”的最早發(fā)生時(shí)間ve(j)ve(j)=從源點(diǎn)到頂點(diǎn)j的最長(zhǎng)路徑長(zhǎng)度;“事件(頂點(diǎn))”的最遲發(fā)生時(shí)間vl(k)

vl(k)=從頂點(diǎn)k到匯點(diǎn)的最短路徑長(zhǎng)度。第八十二頁(yè),共一百頁(yè),2022年,8月28日

假設(shè)第i條弧為<j,k>

則對(duì)第i項(xiàng)活動(dòng)言

“活動(dòng)(弧)”的最早開(kāi)始時(shí)間e(i)e(i)=ve(j);

“活動(dòng)(弧)”的最遲開(kāi)始時(shí)間l(i)l(i)=vl(k)–dut(<j,k>);活動(dòng)ai的時(shí)間余量:l(i)-e(i)

若l[k]==e[k]表示活動(dòng)ai是關(guān)鍵活動(dòng)。jkai第八十三頁(yè),共一百頁(yè),2022年,8月28日

事件發(fā)生時(shí)間的計(jì)算公式:

ve(源點(diǎn))=0;

ve(k)=Max{ve(j)+dut(<j,k>)}vl(匯點(diǎn))=ve(匯點(diǎn));

vl(j)=Min{vl(k)–dut(<j,k>)}第八十四頁(yè),共一百頁(yè),2022年,8月28日abcdefghk6452118724400000000064571157151418181818181818181818161486610807拓?fù)溆行蛐蛄?a-d-f-c-b-e-h-g-k第八十五頁(yè),共一百頁(yè),2022年,8月28日0645771514181814161078660000645777151414160236688710第八十六頁(yè),共一百頁(yè),2022年,8月28日

算法的實(shí)現(xiàn)要點(diǎn):顯然,求ve的順序應(yīng)該是按拓?fù)溆行虻拇涡颍?/p>

而求vl的順序應(yīng)該是按拓?fù)淠嫘虻拇涡?;因?yàn)橥負(fù)淠嫘蛐蛄屑礊橥負(fù)溆行蛐蛄械哪嫘蛄?,因此?yīng)該在拓?fù)渑判虻倪^(guò)程中,另設(shè)一個(gè)“?!庇浵峦?fù)溆行蛐蛄?。第八十七?yè),共一百頁(yè),2022年,8月28日

StatusTopologicalOrder(ALGraphG,Stack&T){

FindinDdegree(G,indegree);InitStack(T);count=0;ve[0..G.vexnum-1]=0;

while(!StackEmpty(S)){pop(S,j);Push(T,j);++count;for(p=G.vertices[j].firstarc;p;p=p->nextarc){k=p->adjvex;if(--indegree[k]==0)Push(S,k);if(ve[j]+*(p->info)=dut(<j,k>)ve[k]=ve[j]+*(p->info);}}

if(count<G.vexnum)ruturnERROR;elsereturnOK;}第八十八頁(yè),共一百頁(yè),2022年,8月28日StatusCriticalPath(ALGraphG){if(!TopologicalOrder(G,t))returnERROR;

vl[0..G.vexnum-1]=ve[G.vexnum-1];

while(!StackEmpty(T))for(Pop(T,j),p=G.vertices[j].firstarc;p;p=p->vextarc){k=p->adjvex;dut=*(p->info);if(vl[k]-dut<vl[j])vl[j]=vl[k]-dut;}

for(j=0;j<G.vexnum;++j)for(p=G.vertices[j].firstarc;p;p=p->nextarc){k=p->adjvex;dut=*(p->info);ee=ve[j];el=vl[k]-dut;

tag=(ee==el)?‘*’:’’printf(j,k,dut,ee,el,tag);}}第八十九頁(yè),共一百頁(yè),2022年,8月28日7.6兩點(diǎn)之間的

最短路徑問(wèn)題求從某個(gè)源點(diǎn)到其余各點(diǎn)的最短路徑每一對(duì)頂點(diǎn)之間的最短路徑

第九十頁(yè),共一百頁(yè),2022年,8月28日求從源點(diǎn)到其余各點(diǎn)的最短路徑的算法的基本思想:依最短路徑的長(zhǎng)度遞增的次序求得各條路徑源點(diǎn)v1…其中,從源點(diǎn)到頂點(diǎn)v的最短路徑是所有最短路徑中長(zhǎng)度最短者。v2第九十一頁(yè),共一百頁(yè),2022年,8月28日這條路徑必定是直接從源點(diǎn)到該點(diǎn)v1只含一條弧,并且這條弧的權(quán)值最小。下一條路徑長(zhǎng)度次短的最短路徑的特點(diǎn):路徑長(zhǎng)度最短的最短路徑的特點(diǎn):它只可能有兩種情況:或者是直接從源點(diǎn)到該點(diǎn)v2(只含一條弧);或者是從源點(diǎn)經(jīng)過(guò)頂點(diǎn)v1,再到達(dá)該頂點(diǎn)v2(由兩條弧組成)。第九十二頁(yè),共一百頁(yè),2022年,8月28日其余最短路徑的特點(diǎn):再下一條路徑長(zhǎng)度次短的最短路徑的特點(diǎn):它可能有三種情況:或者是直接從源點(diǎn)到該點(diǎn)v3(只含一條弧);或者是從源點(diǎn)經(jīng)過(guò)頂點(diǎn)v1,再到達(dá)該頂點(diǎn)(由兩條弧組成);或者是從源點(diǎn)經(jīng)過(guò)頂點(diǎn)v2,再到達(dá)該頂點(diǎn)v3。它或者是直接從源點(diǎn)到該點(diǎn)(只含一條弧);或者是從源點(diǎn)經(jīng)過(guò)已求得最短路徑的頂點(diǎn),再到達(dá)該頂點(diǎn)。第九十三頁(yè),共一百頁(yè),2022年,8月28日求最短路徑的迪杰斯特拉算法:一般情況下,Dist[k]=<源點(diǎn)到頂點(diǎn)k的弧上的權(quán)值>或者=<源點(diǎn)到已求出最短路徑的頂點(diǎn)的路徑長(zhǎng)度>+<已求出最短路徑的頂點(diǎn)到頂點(diǎn)k的弧上的權(quán)值>。

設(shè)置輔助數(shù)組Dist,其中每個(gè)分量Dist[k]表示當(dāng)前所求得的從源點(diǎn)到其余各頂點(diǎn)k的最短路徑。第九十四頁(yè),共一百頁(yè),2022年,8月28日1)在所有從源點(diǎn)出發(fā)的弧中選取一條權(quán)值最小的弧,即為第一條最短路徑。2)修改其它各頂點(diǎn)的Dist[k]值。假設(shè)求得最短路徑的頂點(diǎn)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論