版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1,第七章 圖,2,7.1 抽象數(shù)據(jù)類型圖的定義,7.2 圖的存儲表示,7.3 圖的遍歷,7.4 最小生成樹,7.6 最短路徑問題,7.5 拓?fù)渑判?、關(guān)鍵路徑,3,熟悉圖的各種存儲結(jié)構(gòu)及其構(gòu)造算法,了解實際問題的求解效率與采用何種存儲結(jié)構(gòu)和算法有密切聯(lián)系。 2. 熟練掌握圖的兩種搜索路徑的遍歷:深度優(yōu)先搜索和廣度優(yōu)先搜索的算法。 3. 圖的算法應(yīng)用。,學(xué)習(xí)提要,4,圖(Graph):圖G是由兩個集合V(G)和E(G)組成的,記為G=(V,E)。 其中:V(G)是頂點的非空有限集,E(G)是邊的有限集合,邊是頂點的無序?qū)蛴行驅(qū)Α?有向圖:有向圖G是由兩個集合V(G)和E(G)組成。 其中:V
2、(G)是頂點的非空有限集E(G)是有向邊(也稱弧)的有限集合,弧是頂點的有序?qū)?,記為,v,w是頂點,v為弧尾,w為弧頭。 無向圖:無向圖G是由兩個集合V(G)和E(G)組成的。 其中:V(G)是頂點的非空有限集,E(G)是邊的有限集合,邊是頂點的無序?qū)?,記為(v,w)或(w,v),并且(v,w)=(w,v),圖的定義和術(shù)語,5,圖G1中:V(G1)=1,2,3,4,5,6 E(G1)=, , , , , , ,圖G2中:V(G2)=1,2,3,4,5,6,7 E(G1)=(1,2), (1,3), (2,3), (2,4),(2,5), (5,6), (5,7),6,有向完備圖:n個頂點的有向
3、圖最大邊數(shù)是n(n-1)。 無向完備圖:n個頂點的無向圖最大邊數(shù)是n(n-1)/2。,7,權(quán):與圖的邊或弧相關(guān)的數(shù)。 網(wǎng):帶權(quán)的圖,8,子圖:如果圖G(V,E)和圖G(V,E),滿足: VV,E E,則稱G為G的子圖。,9,頂點的度 無向圖中,頂點的度為與每個頂點相連的邊數(shù)。 有向圖中,頂點的度分成入度與出度。 入度:以該頂點為頭的弧的數(shù)目。 出度:以該頂點為尾的弧的數(shù)目。,10,路徑:路徑是頂點的序列V=Vi,0,Vi,1,Vi,n,滿足 (Vi,j-1,Vi,j)E 或 E,(1j n)。 路徑長度:沿路徑邊的數(shù)目或沿路徑各邊權(quán)值之和。 回路:第一個頂點和最后一個頂點相同的路徑。 簡單路徑
4、:序列中頂點不重復(fù)出現(xiàn)的路徑叫 簡單回路:除了第一個頂點和最后一個頂點外,其余 頂點不重復(fù)出現(xiàn)的回路。,路徑:1,2,3,5,6,3 路徑長度:5 簡單路徑:1,2,3,5 回路:1,2,3,5,6,3,1 簡單回路:3,5,6,3,11,路徑:1,2,5,7,6,5,2,3 路徑長度:7 簡單路徑:1,2,5,7,6 回路:1,2,5,7,6,5,2,1 簡單回路:1,2,3,1,12,連通:從頂點V到頂點W有路徑,則說V和W是連通的。 連通圖:圖中任意兩個頂點都是連通的圖。,13,連通分量:非連通圖的每一個連通部分。 強(qiáng)連通圖:有向圖中,如果對每一對Vi,Vj V, ViVj,從Vi到Vj
5、 和從Vj到 Vi都存在路徑,則稱G是強(qiáng)連通圖。,14,7.2 圖的存儲表示,一、圖的數(shù)組(鄰接矩陣)存儲表示,二、圖的鄰接表存儲表示,三、有向圖的十字鏈表存儲表示,四、無向圖的鄰接多重表存儲表示,15,Aij=,0 (i,j)VR,1 (i,j)VR,圖的數(shù)組(鄰接矩陣)存儲表示,定義:矩陣的元素為,特點:對稱矩陣,頂點的度數(shù),FirstAdjVex(G, v);,NextAdjVex(G, v, w);,如何求?,A B C D E F,A B C D E F,16,從無向圖的鄰接矩陣可以得出如下結(jié)論,(1)矩陣是對稱的,可壓縮存儲(上(下)三角); (2)第i行或第i 列中1的個數(shù)為頂點
6、i 的度; (3)矩陣中1的個數(shù)的一半為圖中邊的數(shù)目; (4)很容易判斷頂點i 和頂點j之間是否有邊相連(看矩陣中i行j列值是否為1)。,17,有向圖的鄰接矩陣,從有向圖的鄰接矩陣可以得出如下結(jié)論,(1) 矩陣不一定是對稱的; (2) 第i 行中1的個數(shù)為頂點i 的出度; (3) 第i列中1的個數(shù)為頂點 i的入度; (4) 矩陣中1的個數(shù)為圖中弧的數(shù)目; (5) 很容易判斷頂點i 和頂點j 是否有弧相連.,A B C D E,A B C D E,18,網(wǎng)的鄰接矩陣表示,類似地可以定義網(wǎng)的鄰接矩陣為: wij 若(i,j)E(G)或i,jE(G) 其它情形,Aij=,1 2 3 4 5,1 2
7、3 4 5,19,const MAX_VERTEX_NUM = 20;/ 最大頂點個數(shù)typedef enum DG, DN, AG, AN GraphKind; / 類型標(biāo)志有向圖,有向網(wǎng),無向圖,無向網(wǎng)typedef struct ArcCell / 弧的定義 VRType adj; / VRType是頂點關(guān)系類型。/ 對無權(quán)圖,用1或0表示相鄰否;對帶權(quán)圖,則為權(quán)值類型。InfoType *info; / 該弧相關(guān)信息的指針 AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typedef struct / 圖的定義VertexType vexsMAX_VERT
8、EX_NUM; / 頂點信息AdjMatrix arcs; / 表示頂點之間關(guān)系的二維數(shù)組int vexnum, arcnum; / 圖的當(dāng)前頂點數(shù)和弧(邊)數(shù)GraphKind kind; / 圖的種類標(biāo)志 MGraph;,圖的C語言描述,20,容易實現(xiàn)圖的操作,如:求某頂點的度、判斷頂點之間是否有邊(?。?、找頂點的鄰接點等等。 n個頂點需要n*n個單元存儲邊(弧);空間效率為O(n2)。,鄰接矩陣存儲方式的優(yōu)點:,鄰接矩陣存儲方式缺點:,21,圖的鄰接表存儲表示,頂點的度數(shù),FirstAdjVex(G, v);,NextAdjVex(G, v, w);,如何求?,例,1,2,3,4,a,c
9、,d,b,data,firstarc,adjvex,next,5,e,22,有向圖的鄰接表,頂點的出度和入度,FirstAdjVex(G, v);,NextAdjVex(G, v, w);,如何求?,23,有向圖的逆鄰接表,在有向圖的鄰接表中,對每個頂點,鏈接的是指向該頂點的弧。,24,typedef struct ArcNode int adjvex; / 該弧所指向的頂點的下標(biāo) struct ArcNode *nextarc; / 指向下一條弧的指針 InfoType *info; / 該弧相關(guān)信息的指針 ArcNode;,adjvex nextarc info,弧的結(jié)點結(jié)構(gòu),typede
10、f struct VNode VertexType data; / 頂點信息 ArcNode *firstarc; / 指向第一條依附該頂點的弧 VNode, AdjListMAX_VERTEX_NUM;,data firstarc,頂點的結(jié)點結(jié)構(gòu),25,typedef struct AdjList vertices; int vexnum, arcnum; int kind; / 圖的種類標(biāo)志 ALGraph;,圖的結(jié)構(gòu)定義,26,已知某網(wǎng)的鄰接(出邊)表,請畫出該網(wǎng)絡(luò)。,80,64,1,2,5,當(dāng)鄰接表的存儲結(jié)構(gòu)形成后,圖便唯一確定!,27,討論:鄰接表與鄰接矩陣有什么異同之處?,1. 聯(lián)
11、系:鄰接表中每個鏈表對應(yīng)于鄰接矩陣中的一行,鏈表中結(jié)點個數(shù)等于一行中非零元素的個數(shù)。 2. 區(qū)別: 對于任一確定的無向圖,鄰接矩陣是唯一的(行列號與頂點編號一致),但鄰接表不唯一(鏈接次序與頂點編號無關(guān))。 鄰接矩陣的空間復(fù)雜度為O(n2),而鄰接表的空間復(fù)雜度為O(n+e)。 3. 用途:鄰接矩陣多用于稠密圖的存儲(e接近n(n-1)/2);而鄰接表多用于稀疏圖的存儲(en2),28,有向圖的十字鏈表表示法,29,typedef struct / 十字鏈表結(jié)構(gòu)定義VexNode xlistMAX_VERTEX_NUM; / 表頭向量int vexnum, arcnum; / 有向圖的當(dāng)前頂點
12、數(shù)和弧數(shù)GraphKind kind; / 圖的種類標(biāo)志 OLGraph;,30,31,頂點結(jié)點: typedef struct dnode int data; /存與頂點有關(guān)的信息 struct node *firstedge; /指向第一條依附于該頂點的邊 vexnode;,邊結(jié)點: typedef struct node int mark; / 訪問標(biāo)記域 int ivex, jvex; /該邊依附的兩個頂點在表頭數(shù)組中位置 struct node *ilink, *jlink; /分別指向依附于ivex和jvex的下一條邊 EgeNode;,無向圖的鄰接多重表表示法,32,typede
13、f struct / 多重鏈表結(jié)構(gòu)定義VexNode adjmulistMAX_VERTEX_NUM;int vexnum, edgenum; / 無向圖的當(dāng)前頂點數(shù)和邊數(shù)GraphKind kind; / 圖的種類標(biāo)志 AMLGraph;,33,34,各種存儲結(jié)構(gòu)的適用類型,數(shù)組: 有向圖和無向圖 鄰接表(逆鄰接表):有向圖和無向圖 十字鏈表: 有向圖 鄰接多重表: 無向圖,35,7.3 圖的遍歷,從圖中某個頂點出發(fā)游歷圖,訪遍圖中其余頂點,并且使圖中的每個頂點僅被訪問一次的過程。,深度優(yōu)先搜索,廣度優(yōu)先搜索,遍歷應(yīng)用舉例,36,1、深度優(yōu)先遍歷(DFS) 方法:從圖的某一頂點V0出發(fā),訪問
14、此頂點;然后依次從V0的未被訪問的鄰接點出發(fā),深度優(yōu)先遍歷圖,直至圖中所有和V0相通的頂點都被訪問到;若此時圖中尚有頂點未被訪問,則另選圖中一個未被訪問的頂點作起點,重復(fù)上述過程,直至圖中所有頂點都被訪問為止。,37,38,深度遍歷:V1,V3 ,V7 ,V6 ,V2 ,V5 ,V8 ,V4,39,深度優(yōu)先遍歷算法:遞歸算法,40,深度遍歷:V1,V3 ,V7 ,V6 ,V2 ,V4 ,V8 ,V5,void DFS(Graph G, int v) / 從頂點v出發(fā),深度優(yōu)先搜索遍歷圖 G visitedv = TRUE; VisitFunc (v); for(w=FirstAdjVex(G,
15、 v); w!=0; w=NextAdjVex(G,v,w) if (!visitedw) DFS(G, w); / 對v的尚未訪問的鄰接頂點w / 遞歸調(diào)用DFS / DFS,問題?,按該存儲結(jié)構(gòu)得到的遍歷次序是否唯一?,41,void DFSTraverse(ALGraph G) / 對以鄰接表表示的圖G作深度優(yōu)先遍歷bool visitedG.vexnum; / 附設(shè)訪問標(biāo)識數(shù)組for (v=0; vG.vexnum; +v)visitedv = FALSE; / 訪問標(biāo)識數(shù)組初始化for (v=0; vG.vexnum; +v) if (!visitedv) DFS(G, v); /
16、對尚未訪問的頂點調(diào)用DFS,42,廣度優(yōu)先搜索遍歷圖,方法:從圖的某一頂點V0出發(fā),訪問此頂點后,依次訪問V0的各個未曾訪問過的鄰接點;然后分別從這些鄰接點出發(fā),廣度優(yōu)先遍歷圖,直至圖中所有已被訪問的頂點的鄰接點都被訪問到;若此時圖中尚有頂點未被訪問,則另選圖中一個未被訪問的頂點作起點,重復(fù)上述過程,直至圖中所有頂點都被訪問為止,廣度遍歷: V1 V2 V3 V4 V5 V6 V7 V8,43,廣度遍歷:V1 V2 V3 V4 V5 V6 V7 V8,廣度遍歷:V1 V2 V3 V4 V5 V6 V7 V8,廣度遍歷:V1 V2 V3 V4 V6 V7 V8 V5,44,45,46,47,vo
17、id BFSTraverse(Graph G, Status (*Visit)(int v) for (v=0; vG.vexnum; +v) visitedv = FALSE; /初始化訪問標(biāo)志 InitQueue(Q); / 置空的輔助隊列Q for ( v=0; vG.vexnum; +v ) if ( !visitedv) / v 尚未訪問 visitedu = TRUE; Visit(u); / 訪問u EnQueue(Q, v); / v入隊列 / BFSTraverse,while (!QueueEmpty(Q) DeQueue(Q, u); / 隊頭元素出隊并置為u for(w
18、=FirstAdjVex(G, u); w!=0; w=NextAdjVex(G,u,w) if ( ! visitedw) visitedw=TRUE; Visit(w); EnQueue(Q, w); / 訪問的頂點w入隊列 / if / while ,48,定義:所有頂點均由邊連接在一起,但不存在回路的圖。 深度優(yōu)先 生成樹與廣度優(yōu)先 生成樹。 生成森林:非連通圖每個連通分量的生成樹一起組成非連通圖的生成森林。 說明 (1)一個圖可以有許多棵不同的生成樹 (2)所有生成樹具有以下共同特點: 生成樹的頂點個數(shù)與圖的頂點個數(shù)相同 生成樹是圖的極小連通子圖 一個有n個頂點的連通圖的生成樹有n-
19、1條邊 生成樹中任意兩個頂點間的路徑是唯一的 在生成樹中再加一條邊必然形成回路 含n個頂點n-1條邊的圖不一定是生成樹,生成樹,49,深度遍歷:V1 V2 V4 V8 V5 V3 V6 V7,廣度遍歷:V1 V2 V3 V4 V5 V6 V7 V8,深度優(yōu)先生成樹,廣度優(yōu)先生成樹,50,51,問題提出: 要在n個城市間建立通信聯(lián)絡(luò)網(wǎng),頂點表示城市,權(quán)表示城市間建立通信線路所需花費代價。希望找到一棵生成樹,它的每條邊上的權(quán)值之和(即建立該通信網(wǎng)所需花費的總代價)最小。 問題分析: n個城市間,最多可設(shè)置n(n-1)/2條線路 n個城市間建立通信網(wǎng),只需n-1條線路 問題轉(zhuǎn)化為: 如何在可能的線路
20、中選擇n-1條,能把所有城市(頂點)均連起來,且總耗費(各邊權(quán)值之和)最小。,最小生成樹,52,方法一:普里姆(Prim)算法 算法思想:設(shè)N=(V,E)是連通網(wǎng),TE是N上最小生成樹中邊的集合。 (1)初始令U=u0,(u0V), TE= ; (2)在所有uU,vV-U的邊(u,v)E中,找一條代價最小的邊(u0,v0)并入集合TE,同時v0并入U; (3)重復(fù)上述操作直至U=V為止,則T=(V,TE)為N的最小生成樹。 算法實現(xiàn):圖用鄰接矩陣表示 算法評價:T(n)=O(n),構(gòu)造最小生成樹方法,53,1,從V1開始構(gòu)造,即U=V1,54,struct VertexType adjvex;
21、 / U集合中的頂點序號 VRType lowcost; /和頂點集U中頂點相連接的最小代價 closedgeMAX_VERTEX_NUM;,設(shè)置一個輔助數(shù)組,對當(dāng)前VU集中的每個頂點,記錄和頂點集U中頂點相連接的代價最小的邊:,55,a,b,c,d,e,g,f,19,5,14,18,27,16,8,21,3,a,e,12,d,c,b,7,a,a,a,19,14,18,14,例如:,e,12,e,e,8,16,8,d,3,d,d,7,21,3,c,5,5,a,b,c,d,e,f,g,a,e,b,c,d,f,g,a,e,d,b,c, f,g,a,e,d,c,b, f,g,a,e,d,c,b,f,
22、g,a b c d e f g,g,f,56,const MAX_VERTEX_NUM = 20;/ 最大頂點個數(shù)typedef enum DG, DN, AG, AN GraphKind; / 類型標(biāo)志有向圖,有向網(wǎng),無向圖,無向網(wǎng)typedef struct ArcCell / 弧的定義 VRType adj; / VRType是頂點關(guān)系類型。/ 對無權(quán)圖,用1或0表示相鄰否;對帶權(quán)圖,則為權(quán)值類型。InfoType *info; / 該弧相關(guān)信息的指針 AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typedef struct / 圖的定義VertexTyp
23、e vexsMAX_VERTEX_NUM; / 頂點信息AdjMatrix arcs; / 表示頂點之間關(guān)系的二維數(shù)組int vexnum, arcnum; / 圖的當(dāng)前頂點數(shù)和弧(邊)數(shù)GraphKind kind; / 圖的種類標(biāo)志 MGraph;,圖的鄰接矩陣存儲表示的C語言描述,57,void MiniSpanTree_P(MGraph G, VertexType u) /用普里姆算法從頂點u出發(fā)構(gòu)造網(wǎng)G的最小生成樹 k = LocateVex ( G, u ); for ( j=0; jG.vexnum; +j ) / 輔助數(shù)組初始化 if (j!=k) closedgej = u,
24、 G.arcskj.adj ; closedgek.lowcost = 0; / 初始,Uu for (i=1; iG.vexnum; +i) k = minimum(closedge); / 求出加入生成樹的下一個頂點(k) printf(closedgek.adjvex, G.vexsk); / 輸出生成樹上一條邊 closedgek.lowcost = 0; / 第k頂點并入U集 for (j=0; jG.vexnum; +j) /修改closedge數(shù)組 if (G.arcskj.adj closedgej.lowcost) closedgej = G.vexsk, G.arcskj.
25、adj ; ,58,方法二:克魯斯卡爾(Kruskal)算法 算法思想:設(shè)連通網(wǎng)N=(V,E),令最小生成樹 (1)初始狀態(tài)為只有n個頂點而無邊的非連通圖T=(V,),每個頂點自成一個連通分量; (2)在E中選取代價最小的邊,若該邊依附的頂點落在T中不同的連通分量上,則將此邊加入到T中;否則,舍去此邊,選取下一條代價最小的邊; (3)依此類推,直至T中所有頂點都在同一連通分量上為止。,59,(0)用頂點數(shù)組和邊數(shù)組存放頂點和邊信息 (1)初始時,令每個頂點的jihe互不相同;每個邊的flag為0 (2)選出權(quán)值最小且flag為0的邊 (3)若該邊依附的兩個頂點的jihe 值不同,即非連通,則令
26、 該邊的flag=1, 選中該邊;再令該邊依附的兩頂點的jihe 以及兩集合中所有頂點的jihe 相同 若該邊依附的兩個頂點的jihe 值相同,即連通,則令該 邊的flag=2, 即舍去該邊 (4)重復(fù)上述步驟,直到選出n-1條邊為止,頂點結(jié)點: typedef struct int data; /頂點信息 int jihe; VEX;,邊結(jié)點: typedef struct int vexh, vext; /邊依附的兩頂點 int weight; /邊的權(quán)值 int flag; /標(biāo)志域 EDGE;,算法實現(xiàn),60,1,1,1,1,1,4,2,1,1,1,2,2,2,2,2,算法描述,2,6
27、1,普里姆算法,克魯斯卡爾算法,時間復(fù)雜度,O(n2),O(eloge),稠密圖,稀疏圖,算法名,適應(yīng)范圍,兩種算法的比較,62,問題提出: 學(xué)生選修課程問題 頂點表示課程,有向弧表示先決條件,若課程i是課程j的先決條件,則圖中有弧,學(xué)生應(yīng)按怎樣的順序?qū)W習(xí)這些課程,才能無矛盾、順利地完成學(xué)業(yè),這就牽涉到拓?fù)渑判颉?拓?fù)渑判?63,定義 AOV網(wǎng):用頂點表示活動,用弧表示活動間優(yōu)先關(guān)系的有向圖稱為頂點表示活動的網(wǎng)(Activity On Vertex network),簡稱AOV網(wǎng)。 若是圖中有向邊,則vi是vj的直接前驅(qū);vj是vi的直接后繼。 AOV網(wǎng)中不允許有回路,否則意味著某項活動以自己
28、為先決條件。 拓?fù)渑判颍喊袮OV網(wǎng)絡(luò)中各頂點按照它們相互之間的優(yōu)先關(guān)系排列成一個線性序列的過程。 檢測AOV網(wǎng)中是否存在環(huán)方法:對有向圖構(gòu)造其頂點的拓?fù)溆行蛐蛄校艟W(wǎng)中所有頂點都在它的拓?fù)溆行蛐蛄兄校瑒t該AOV網(wǎng)必定不存在環(huán)。,64,拓?fù)渑判虻姆椒?(1)在有向圖中選一個沒有前驅(qū)的頂點且輸出之; (2)從圖中刪除該頂點和所有以它為尾的??; (3)重復(fù)上述兩步,直至全部頂點均已輸出;或者當(dāng)圖中不存在無前驅(qū)的頂點為止,65,拓?fù)湫蛄校篊1-C2-C3-C4-C5-C7-C9-C10-C11-C6-C12-C8 或 :C9-C10-C11-C6-C1-C12-C4-C2-C3-C5-C7-C8,注意
29、:一個AOV網(wǎng)的拓?fù)湫蛄胁皇俏ㄒ坏?66,(1)先選擇沒有前驅(qū)的頂點C1,刪除C1和所有以它為尾的弧。,67,(2)選擇沒有前驅(qū)的頂點C2,刪除C2和所有以它為尾的弧。 拓?fù)湫蛄校篊1-C2,(3)選擇沒有前驅(qū)的頂點C3,刪除C3和所有以它為尾的弧。 拓?fù)湫蛄校篊1-C2-C3,68,C4,C5,(4)選擇沒有前驅(qū)的頂點C4,刪除C4和所有以它為尾的弧。 拓?fù)湫蛄校篊1-C2-C3-C4,(5)選擇沒有前驅(qū)的頂點C5,刪除C5和所有以它為尾的弧。 拓?fù)湫蛄校篊1-C2-C3-C4C5,69,70,71,那么如何進(jìn)行拓?fù)渑判??步驟如下: (1) 在AOV網(wǎng)中選擇一個沒有前驅(qū)的頂點并輸出;(2)
30、從AOV網(wǎng)中刪除該頂點以及從它出發(fā)的?。恢貜?fù)以上兩步直至AOV網(wǎng)變空(即已輸出所有頂點) 或者剩余子圖中不存在沒有前驅(qū)的頂點。 后一種情況則說明該AOV網(wǎng)中含有向環(huán)。,如右所示AOV網(wǎng)的拓?fù)渑判虻倪^程如動畫所示。,圖中存在一個有向環(huán),則在拓?fù)渑判蜉敵鲰旤cc之后就 找不到?jīng)]有前驅(qū)的頂點了,沒有前驅(qū)的頂點 入度為零的頂點,刪除頂點及以它為尾的弧 弧頭頂點的入度減1,72,算法實現(xiàn) (1)以鄰接表作存儲結(jié)構(gòu); (2)把鄰接表中所有入度為0的頂點進(jìn)棧,便于查詢; (3)棧非空時,輸出棧頂元素Vj并退棧;在鄰接表中查找Vj的直接后繼Vk,把Vk的入度減1;若Vk的入度為0則進(jìn)棧; (4)重復(fù)上述操作直至
31、??諡橹埂H魲?諘r輸出的頂點個數(shù)不是n,則有向圖有環(huán);否則,拓?fù)渑判蛲戤?73,算法描述,1,6,74,輸出序列:6,75,輸出序列:6,76,輸出序列:6,77,輸出序列:6,78,輸出序列:6,79,輸出序列:6,80,輸出序列:6 1,81,輸出序列:6 1,82,輸出序列:6 1,4,83,輸出序列:6 1,4,84,輸出序列:6 1,4,85,輸出序列:6 1,4,3,86,輸出序列:6 1,4,3,87,輸出序列:6 1,4,3,88,輸出序列:6 1,4,3,89,輸出序列:6 1,4,3,90,輸出序列:6 1 3,4,3,91,輸出序列:6 1 3,4,92,輸出序列:6 1
32、 3,4,93,輸出序列:6 1 3,4,94,輸出序列:6 1 3,4,2,95,輸出序列:6 1 3,4,2,96,輸出序列:6 1 3,4,2,97,輸出序列:6 1 3 2,4,2,98,輸出序列:6 1 3 2,4,99,輸出序列:6 1 3 2 4,4,100,輸出序列:6 1 3 2 4,101,輸出序列:6 1 3 2 4,5,102,輸出序列:6 1 3 2 4,5,103,輸出序列:6 1 3 2 4 5,5,104,輸出序列:6 1 3 2 4 5,105,CountInDegree(G,indegree); /對各頂點求入度 InitStack(S); for ( i=
33、0; iG.vexnum; +i) if (!indegreei) Push(S, i); /入度為零的頂點入棧 count=0; /對輸出頂點計數(shù) while (!EmptyStack(S) Pop(S, v); +count; printf(v); for (w=FirstAdj(G,v); w!=0; w=NextAdj(G,v,w) -indegree(w); / 弧頭頂點的入度減一 if (!indegreew) Push(S, w); /新產(chǎn)生的入度為零的頂點入棧 if (countG.vexnum) printf(“圖中有回路”) Else return OK,106,關(guān)鍵路徑
34、問題提出: 把工程計劃表示為有向圖,用頂點表示事件,弧表示活動;每個事件表示在它之前的活動已完成,在它之后的活動可以開始。 例 設(shè)一個工程有11項活動,9個事件。 事件 V1表示整個工程開始,事件V9表示整個工程結(jié)束。 問題:(1)完成整項工程至少需要多少時間? (2)哪些活動是影響工程進(jìn)度的關(guān)鍵?,107,如何求關(guān)鍵活動?,ve(j) =事件Vj的最早發(fā)生時間(從源點到頂點j的最長路徑長度),vl(j) =事件Vj的最遲發(fā)生時間 e(i)表示活動ai的最早開始時間 l(i)表示活動ai的最遲開始時間 關(guān)鍵活動關(guān)鍵路徑上的活動叫,即l(i)=e(i)的活動,源點,匯點,108,設(shè)活動ai用弧表
35、示,其持續(xù)時間記為:dut() 則有: (1)e(i)=Ve(j) (2)l(i)=Vl(k)-dut(),如何求Ve(j)和Vl(j)?,(2)從Vl(n)=Ve(n)開始向后遞推,如何找e(i)=l(i)的關(guān)鍵活動?,(1)從Ve(1)=0開始向前遞推,109,求關(guān)鍵路徑步驟 求Ve(i) 求Vl(j) 求e(i) (e(i)=Ve(j) 求l(i) (Vl(k)-dut() 計算l(i)-e(i),V1 V2 V3 V4 V5 V6 V7 V8 V9,0 6 4 5 7 7 16 14 18,0 6 6 8 7 10 16 14 18,a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11, ,110,問題:從某頂
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 不銹鋼的基礎(chǔ)知識王文華
- (2024)柑桔果渣綜合利用建設(shè)項目可行性研究報告(一)
- 2022-2023學(xué)年天津市河北區(qū)高二(上)期末語文試卷
- 2023年高收縮腈綸項目融資計劃書
- 烹飪原料知識習(xí)題庫(含參考答案)
- 《養(yǎng)生與防治》課件
- 養(yǎng)老院老人生活照料標(biāo)準(zhǔn)制度
- 養(yǎng)老院老人健康飲食營養(yǎng)師表彰制度
- 人教版教學(xué)課件免疫調(diào)節(jié)(上課)
- 《石油和油品》課件
- 承插盤扣懸挑腳手架施工方案
- 播音主持專業(yè)教學(xué)計劃
- 2024年醫(yī)師定期考核臨床類人文醫(yī)學(xué)知識考試題庫及答案(共280題)
- 江蘇省南通市2024屆高三上學(xué)期第一次調(diào)研測試(一模)生物 含答案
- 2024年度企業(yè)數(shù)字化轉(zhuǎn)型服務(wù)合同
- 會議服務(wù)的合同范本(8篇)
- 電梯困人應(yīng)急演練方案
- 【初中歷史】西晉的短暫統(tǒng)一和北方各族的內(nèi)遷課件 2024-2025學(xué)年統(tǒng)編版七年級歷史上冊
- 2024供應(yīng)鏈合作伙伴采購基本協(xié)議
- 中醫(yī)治療淋巴水腫
- 2024年高考真題-政治(江蘇卷) 含解析
評論
0/150
提交評論