




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第五章圖5.1圖的基本概念5.2圖的存儲結構5.3圖的遍歷5.4最小生成樹5.5兩點之間的最短路徑問題5.6用頂點表示活動的網絡(AOV網)5.7用邊表示活動的網絡(AOE網)圖是由頂點集V和邊(?。┘疎構成的數據結構。
Graph=(V,E)其中:V={x|x
某個數據對象}是頂點的有窮非空集合;E是頂點之間關系的有窮集合。如果頂點之間關系是沒有方向的,則稱E為邊(edge)的集合,表示為E={(x,y)|x,yV}如果頂點之間關系是有方向的,則稱E為弧的集合,表示為E={<x,y>|x,yV}5.1圖的形式化定義有向圖:頂點對<x,y>是有序的EACBD例如:有向圖G1=(V1,VR1)其中V1={A,B,C,D,E}VR1={<A,B>,<A,E>,<B,C>,<C,D>,<D,B>,<D,A>,<E,C>}BCAFED例如:
圖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)}無向圖:頂點對(x,y)是無序的。名詞和術語子圖、網、子圖
完全圖、稀疏圖、稠密圖鄰接點、度、入度、出度路徑、路徑長度、簡單路徑、簡單回路連通圖、連通分量、強連通圖、強連通分量生成樹、生成森林ABECFBBC如果圖G=(V,{VR})和圖
G=(V,{VR}),滿足:
VV,VRVR,則稱
G為G的子圖。1597211132
弧或邊帶權的圖分別稱作有向網或無向網。子圖、網、子圖假設圖中有
n
個頂點,e
條邊,則含有e=n(n-1)/2條邊的無向圖稱作完全圖;含有e=n(n-1)條弧的有向圖稱作
有向完全圖;若邊或弧的個數e<nlog2n,則稱作稀疏圖,否則稱作稠密圖。完全圖,有向完全圖,稀疏圖假若頂點v和頂點w之間存在一條邊或弧,則稱頂點v和w互為鄰接點,邊(v,w)或弧<v,w>與頂點v和w相關聯。例如:TD(B)=TD(A)=和某個頂點v關聯的邊的數目定義為v的度。ACDFEB鄰接點,度32頂點的出度:以頂點v為弧尾的弧的數目;ABECF有向圖的入度,出度頂點的入度:以頂點v為弧頭的弧的數目。頂點的度(TD)=出度(OD)+入度(ID)例如:ID(B)=OD(B)=TD(B)=由于弧有方向性,則頂點的度有入度和出度之分123若圖G=(V,{VR})中存在一個頂點序列{u=vi,0,vi,1,…,vi,m=w},其中(vi,j-1,vi,j)VR1≤j≤m,則稱從頂點u到頂點w之間存在一條路徑。路徑上邊或弧的數目稱作路徑長度。ABECF從A到F的路徑序列為:路徑,路徑長度例如:{A,B,C,F}3其路徑長度為:簡單路徑:指序列中頂點不重復出現的路徑。簡單回路:指序列中第一個頂點和最后一個頂點相同的路徑。從A到F的路徑為簡單路徑:簡單路徑,簡單回路ABECF{A,B,C,F}簡單回路:{A,B,C,F,A}若圖G中任意兩個頂點之間都有路徑相通,則稱此圖為連通圖;若無向圖為非連通圖,則圖中各個極大連通子圖稱作此圖的連通分量。BACDFEBACDFE連通圖,無向圖的連通分量
若任意兩個頂點之間都存在一條有向路徑,則稱此有向圖為強連通圖。ABECFABECF對有向圖,非強連通圖的各個極大強連通子圖稱作它的強連通分量。強連通圖,強連通分量強連通圖非強連通圖假設一個連通圖有n個頂點和e條邊,由其中的n個頂點和n-1
條邊構成一個極小連通子圖,稱該極小連通子圖為此連通圖的生成樹。對非連通圖,則稱由各個連通分量的生成樹的集合為此非連通圖的生成森林。BACDFE生成樹和生成森林213213356245136245136G1157324G26有向完全圖無向完全圖圖與子圖頂點5的度=頂點2入度:
出度:頂點4入度:
出度:分別是什么圖?這兩個圖的關系?3頂點2的度=41310245136G1路徑:{1,2,3,5,6,3}路徑長度:簡單路徑:回路:{1,2,3,5,6,3,1}簡單回路:{3,5,6,3}5{1,2,3,5,6}
假設一個連通圖有n個頂點和e條邊,其中n-1條邊和n個頂點構成一個極小連通子圖,稱該極小連通子圖為此連通圖的生成樹。對非連通圖,則稱由各個連通分量的生成樹的集合為此非連通圖的生成森林。BACDFE生成樹和生成森林結構的建立和銷毀插入或刪除頂點對鄰接點的操作對頂點的訪問操作遍歷插入和刪除弧5.1.2圖的基本操作(p171)5.2圖的存儲結構一、
圖的數組(鄰接矩陣)存儲表示二、
圖的鄰接表存儲表示三、有向圖的十字鏈表存儲表示四、無向圖的鄰接多重表存儲表示在圖的鄰接矩陣表示中,有一個記錄各個頂點信息的頂點表,還有一個表示各個頂點之間關系的鄰接矩陣。設圖A=(V,E)是一個有n個頂點的圖,圖的鄰接矩陣是一個二維數組
A.edge[n][n],定義:一、圖的鄰接矩陣(AdjacencyMatrix)存儲表示無向圖的鄰接矩陣是對稱的;有向圖的鄰接矩陣可能是不對稱的。0123012在有向圖中,統計第i
行1的個數可得頂點i
的出度,統計第j列1的個數可得頂點j
的入度。在無向圖中,統計第i
行(列)1的個數可得頂點i
的度。863129542031網絡的鄰接矩陣用鄰接矩陣表示的圖結構的定義constint
NumEdges=50; //邊條數constintNumVertices=10;//頂點個數typedefcharVertexData;//頂點數據類型
typedefintEdgeData;//邊上權值類型typedefstruct{ VertexDatavexList[NumVertices];//頂點表
EdgeDataEdge[NumVertices][NumVertices];
//鄰接矩陣,可視為邊之間的關系
intn,e;//圖中當前的頂點個數與邊數}MTGraph;intGraphEmpty(MTGraph&G){returnG.n==0;}//判圖G空否,空則返回1,否則返回0。EdgeDataGetWeight(MTGraph&G,intu,intv){//給出以頂點
u
和
v
為兩端點的邊上的權值
if(u!=-1&&v!=-1)returnG.Edge[u][v];elsereturn0; }
VertexDataGetValue
(MTGraph&G,inti){//給出第
i個頂點的數據值returni>=0&&i<G.n?G.VexList[i]:“\0”;}
intGetFirstNeighbor(MTGraph&G,intv){//給出頂點位置為
v
的第一個鄰接頂點的位置
if(v!=-1){for(intcol=0;col<G.n;col++)if(G.Edge[v][col]>0&&G.Edge[v][col]<MaxValue)returncol;
//順序檢測第
v行尋找第一個鄰接頂點}return
-1;}intGetNextNeighbor(MTGraph&G,intv,intw){//給出頂點v的某鄰接頂點w的下一個鄰接頂點
intcol;if(v!=-1&&w!=-1){ for(col=w+1;col<G.n;col++)if(Edge[v][col]>0&&Edge[v][col]<MaxValue)returncol;//在第
v行順序尋找下一個鄰接頂點} return-1;}二、圖的鄰接表存儲表示無向圖的鄰接表同一個頂點發出的邊鏈接在同一個邊鏈表中,每一個鏈結點代表一條邊(邊結點),結點中有另一頂點的下標
dest和指針
next。ABCDdataadjABCD0123destnextdestnext130210有向圖的鄰接表和逆鄰接表ABCdataadjABC012destnextdestnext鄰接表(出邊表)dataadjABC012destnext逆鄰接表(入邊表)102011二、圖的鄰接表存儲表示網絡(帶權圖)的鄰接表BACD69528dataadjABCD0123destcostnext1536283219(出邊表)(頂點表)邊結點中保存該邊上的權值cost圖中如有n個頂點,e條邊,則用鄰接表表示無向圖時,需要n個頂點結點,2e個邊結點;用鄰接表表示有向圖時,若不考慮逆鄰接表,只需n個頂點結點,e個邊結點。鄰接表表示的圖的定義constintNumVertices=10;//頂點個數typedefcharVertexData;//頂點數據類型typedefintEdgeData;//邊上權值類型typedefstructnode{//邊結點
intdest;//目標頂點下標
EdgeDatacost; //邊上的權值
Structnode*next;//下一邊鏈接指針}EdgeNode;typedefstruct{//頂點結點
VertexDatadata;//頂點數據域
EdgeNode*firstAdj;
//邊鏈表頭指針}VertexNode;
typedefstruct{//圖的鄰接表
VertexNodeVexList[NumVertices];
//鄰接表
intn,e;
//圖中當前的頂點個數與邊數}AdjGraph;無向圖的鄰接多重表的邊結點結構markvertex1vextex2path1path2指向下一條與頂點vertex2相關聯的邊指向下一條與頂點vertex1相關聯的邊標記位邊的一個頂點的下標位置邊的另一個頂點的下標位置typedefstructEdgeBox{VisitIfmark;//訪問標記
intvertex1,vertex2;//該邊依附的兩個頂點的位置
structEdgeBox*path1,*path2;InfoTypecost;//權重信息
}EBox;無向圖的鄰接多重表的邊結點表示無向圖的鄰接多重表的頂點結點結構datafirstout指向依附于該頂點的第一條邊typedefstructVexNode{//頂點的結構表示
DataTypedata;structEdgeBox*firstout;
}VexNode;頂點的值ABCDdataadjABCD012312030113^^^^e1e2e3e4e1e2e3e4三、有向圖的十字鏈表存儲表示
將有向圖的鄰接表和逆鄰接表結合起來得到的一種鏈表。markvertex1vextex2path1path2指向下一條以vertex2為終點的弧指向下一條以vertex1為起點的弧標記位弧的起點的下標位置弧的終點的下標位置弧的結構typedefstructArcBox{//弧的結構表示
intvertex1,vertex2,mark;structArcBox*path1,*path2;
}VexNode;頂點的結點結構頂點信息數據指向該頂點的第一條入弧指向該頂點的第一條出弧typedefstructVexNode{//頂點的結構表示
VertexTypedata;ArcBox*firstin,*firstout;}VexNode;datafirstinfirstout三、有向圖的十字鏈表存儲表示
ABCABC012∧02∧∧0121∧20∧∧將有向圖的鄰接表和逆鄰接表結合起來得到的一種鏈表。a1a2a3a4a1a2a3a45.3圖的遍歷從圖中某個頂點出發游歷圖,訪遍圖中其余頂點,并且使圖中的每個頂點僅被訪問一次的過程。深度優先搜索廣度優先搜索遍歷應用舉例從深度優先搜索遍歷連通圖的過程類似于樹的先根遍歷;一、深度優先搜索遍歷圖ACDEGBFH12345768前進回退ACDEGBFH12345768深度優先搜索過程深度優先生成樹解決的辦法是:為每個頂點設立一個“訪問標志visited[w]”;由于圖中可能存在回路,且圖的任一頂點都可能與其它頂點相通,在訪問完某個頂點之后可能會沿著某些邊又回到了曾經訪問過的頂點。如何判別V的鄰接點是否被訪問?一、深度優先搜索遍歷圖abchdekfg812345670FFFFFFFFF012345678TTTTTTTTTachdkfebgachkfedbg訪問標志:訪問次序:例如:achdkfevoidDFSTraverse(GraphG,
Status(*Visit)(intv)){
//對圖G作深度優先遍歷。
for(v=0;v<G.vexnum;++v)visited[v]=FALSE;//訪問標志數組初始化
for(v=0;v<G.vexnum;++v)
if(!visited[v])DFS(G,v,Visit);//對尚未訪問的頂點調用DFS}每調用一次DFS()就遍歷了圖的一個連通分量voidDFS(GraphG,intv,
void(*visit)(TElemType&e){//從頂點v出發,深度優先搜索遍歷連通圖Gvisited[v]=TRUE;visit(v);
for(w=FirstAdjVex(G,v);w!=-1;w=NextAdjVex(G,v,w))
if(!visited[w])DFS(G,w,visit);
//對v的尚未訪問的鄰接頂點w//遞歸調用DFS}//DFS二、廣度優先搜索遍歷圖對連通圖,從起始點V到其余各頂點必定存在路徑。其中,A->B,A->C的路徑長度為1;A->D,A->E,A->F,A->G的路徑長度為2;A->H的路徑長度為3。廣度優先搜索過程廣度優先生成樹ACDEGBFH12345678ACDEGBFH深度優先搜索是一種回溯的算法。廣度優先搜索不是,它是一種分層的順序搜索過程,每向前走一步可能訪問一批頂點。因此,廣度優先搜索不是一個遞歸的過程。深度優先VS廣度優先從圖中的某個頂點V0出發,并在訪問V0之后依次訪問V0的所有未被訪問過的鄰接點,之后按這些頂點被訪問的先后次序依次訪問它們的鄰接點,直至圖中所有和V0有路徑相通的頂點都被訪問到。若此時圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點作起始點,重復上述過程,直至圖中所有頂點都被訪問到為止。廣度優先搜索算法實現1423512341342vexdatafirstarc5543^^^adjvexnext551^51143^220123451fr遍歷序列:10123454fr遍歷序列:14323遍歷序列:14325廣度優先遍歷算法示例2012345325fr1423512341342vexdatafirstarc5543^^^adjvexnext551^51143^2201234525fr遍歷序列:143250123455fr遍歷序列/p>
fr遍歷序列:14325for(v=0;v<G.vexnum;++v)
if(
!visited[v]){//v尚未訪問
}
voidBFS(constGraph&G,Status(*Visit)(intv)){}//BFS……
for(v=0;v<G.vexnum;++v)visited[v]=FALSE;//初始化訪問標志InitQueue(Q);//置空的輔助隊列Qwhile(!QueueEmpty(Q)){//遍歷隊列頭的所有鄰接點
}//whileEnQueue(Q,v);//v入隊列visited[v]=TRUE;Visit(v);//訪問uDeQueue(Q,u);//隊頭元素出隊并置為u
for(w=FirstAdjVex(G,u);w!=0;w=NextAdjVex(G,u,w))
if(!visited[w])
{
visited[w]=TRUE;Visit(w);EnQueue(Q,w);
//訪問的頂點w入隊列
}//if連通圖的生成樹假設一個連通圖有n個頂點和e條邊,由其中n-1條邊和n個頂點所構成一個極小連通子圖,稱為此連通圖的生成樹。生成樹具有以下共同特點:生成樹的頂點個數與圖的頂點個數相同一個有n個頂點的連通圖的生成樹有n-1條邊生成樹中任意兩個頂點間的路徑是唯一的在生成樹中再加一條邊必然形成回路V1V2V4V5V3V7V6V8深度遍歷:V1V2V4V5V3V7V6V8深度優先生成樹V1V2V4V5V3V7V6V8廣度優先生成樹V1V2V4V5V3V7V6V8V1V2V4V5V3V7V6V8廣度遍歷:V1V2V4V8V5V3V6V7V1V2V3V4V5V6V7V8
非連通圖的連通分量及生成森林對于非連通圖,從圖中某一頂點出發,利用深度優先搜索算法或廣度優先搜索算法不可能遍歷到圖中的所有頂點,只能訪問到該頂點所在的最大連通子圖(連通分量)的所有頂點。從無向圖的每一個連通分量中的一個頂點出發進行遍歷,即可求得無向圖的所有連通分量及其生成樹。對于非連通的無向圖,所有連通分量的生成樹組成了非連通圖的生成森林。IHJONMLK非連通無向圖ACDEBFGACDEBFGHIJKONML非連通圖的連通分量從不同頂點出發,通過強連通有向圖的遍歷,可以得到不同的生成樹。強連通有向圖
深度優先生成樹ACDEBFACDEBF123456ACDEBF123456ACDEBF123456
(連通網的)最小生成樹構造網的一棵最小生成樹,即:在e條帶權的邊中選取n-1條邊(不構成回路),使“權值之和”為最小。(連通網的)最小生成樹構造最小生成樹的準則:1必須使用且僅使用該帶權圖中的n-1條邊來聯結網絡中的n個頂點;2不能使用產生回路的邊;3各邊上的權值的總和達到最小。算法二:(克魯斯卡爾算法)算法一:(普里姆算法)(連通網的)最小生成樹普里姆算法的基本思想:從連通帶權圖N={V,E}中的某一頂點u0
出發,選擇與u0相關聯的具有最小權值的邊(u0,v),將其頂點v加入到生成樹頂點集合U中。以后每一步從一個頂點在U中,而另一個頂點不在U中的各條邊中選擇權值最小的邊(u,v),把v加入到集合U
中。如此繼續下去,直到帶權圖中的所有頂點都加入到生成樹頂點集合U中為止。采用鄰接矩陣作為帶權圖的存儲表示。abcdegf195141827168213127Prim算法示例:aedcbgf148531621所得生成樹權值和=14+8+3+5+16+21=67在生成樹的構造過程中,圖中n個頂點分屬兩個集合:已落在生成樹上的頂點集U和尚未落在生成樹上的頂點集V-U,則應在所有連通U中頂點和V-U中頂點的邊中選取權值最小的邊。
一般情況下所添加的頂點應滿足下列條件:UV-U設置一個輔助數組,對當前V-U集中的每個頂點,記錄和頂點集U中頂點相連接的代價最小的邊:struct{VertexTypeadjvex;//U集中的頂點序號
VRTypelowcost;//邊的權值}closedge[MAX_VERTEX_NUM];abcdegf195141827168213127aedcbaaa19141814e12ee8168d3dd7213c55
19mm14m18195712mmm53mmmm73821m1412m8m16mmm21m2718mmm162701234561621gf0000000voidMiniSpanTree_P(MGraphG,VertexTypeu){
//用普里姆算法從頂點u出發構造網G的最小生成樹}
k=LocateVex(G,u);//找出頂點u的邊信息在數組中的行號
for(j=0;j<G.vexnum;++j)//輔助數組closedge初始化
if(j!=k)
closedge[j]={u,G.arcs[k][j].adj};
closedge[k].lowcost=0;//初始,U={u}for(i=0;i<G.vexnum;++i){
繼續向生成樹上添加頂點;}
k=minimum(closedge.lowcost);
//求出加入生成樹的下一個頂點(k)
printf(closedge[k].adjvex,G.vexs[k]);//輸出生成樹上一條邊
closedge[k].lowcost=0;//第k頂點并入U集
for(j=0;j<G.vexnum;++j)//修改其它頂點的最小邊
if(G.arcs[k][j].adj<closedge[j].lowcost)closedge[j]={G.vexs[k],G.arcs[k][j].adj};
具體做法:先構造一個只含n個頂點的子圖SG,然后從權值最小的邊開始,若它的添加不使SG中產生回路,則在SG上加上這條邊,如此重復,直至加上n-1條邊為止??紤]問題的出發點:為使生成樹上邊的權值之和達到最小,則應使生成樹中每一條邊的權值盡可能地小。克魯斯卡爾算法的基本思想:算法描述:構造非連通圖ST=(V,{});k=i=0;//k計選中的邊數
while(k<n-1){++i;
檢查邊集E中第i條權值最小的邊(u,v);
若(u,v)加入ST后不使ST中產生回路,
則輸出邊(u,v);
且k++;}abcdegf195141827168213127aedcbgf148531621克魯斯卡爾算法示例:71218195.5最短路徑(ShortestPath)如果從圖中某一頂點(稱為源點)到達另一頂點(稱為終點)的路徑可能不止一條,如何找到一條路徑使得沿此路徑上各邊上的權值總和達到最小。有兩類最短路徑問題
求從某個源點到其余各點的最短路徑—Dijkstra算法
每一對頂點之間的最短路徑—Floyd算法單源最短路徑問題問題的提法:給定一個帶權有向圖D與源點v,求從
v
到D中其它頂點的最短路徑。限定各邊上的權值大于或等于0。為求得這些最短路徑,Dijkstra提出按路徑長度的遞增次序,逐步產生最短路徑的算法。首先求出長度最短的一條最短路徑,再參照它求出長度次短的一條最短路徑,依次類推,直到從頂點v到其它各頂點的最短路徑全部求出為止。在這條路徑上,必定只含一條弧,并且這條弧的權值最小。下一條路徑長度次短的路徑的特點:路徑長度最短的最短路徑的特點:它只可能有兩種情況:或者是直接從源點到該點(只含一條弧);或者是,從源點經過某個已求得最短路徑的頂點v1,再到達該頂點(由兩條弧組成)。其余最短路徑的特點:它或者是直接從源點到該點(只含一條弧);或者是,從源點經過已求得最短路徑的頂點,再到達該頂點。求最短路徑的迪杰斯特拉算法:把V分成兩組:(1)S:已求出最短路徑的頂點的集合(2)V-S=T:尚未確定最短路徑的頂點集合算法將T中頂點按最短路徑遞增的次序加入到S中,保證:從源點V0到S中各頂點的最短路徑長度都不大于從V0到T中任何頂點的最短路徑長度。設置輔助數組Dist,其中每個分量Dist[k]記錄
當前所求得的從源點到其余各頂點k的最短路徑。13<V0,V1>8<V0,V2>30<V0,V4>32<V0,V6>V2:8<V0,V2>13<V0,V1>-------13<V0,V2,V3>30<V0,V4>32<V0,V6>V1:13<V0,V1>--------------13<V0,V2,V3>30<V0,V4>22<V0,V1,V5>20<V0,V1,V6>V3:13<V0,V2,V3>---------------------19<V0,V2,V3,V4>22<V0,V1,V5>20<V0,V1,V6>V4:19<V0,V2,V3,V4>終點從V0到各終點的最短路徑及其長度V1V2V3V4V5V6Vj--------------------------------21<V0,V2,V3,V4,V5>20<V0,V1,V6>V6:20<V0,V1,V6>516432085623013717329
138m30m32mmmm97mm5mmmmmm6mmmmmm2mmmmmm17mmmmmmDijkstra算法可描述如下:①
初始化:
S←{v0};
dist[j]←Edge[0][j],j=1,2,…,n-1;
//n為圖中頂點個數②求出最短路徑的長度:
dist[k]←min{dist[i]},
i
V-S
;S←{k
};③修改:
dist[i]←min{dist[i],dist[k]+Edge[k][i]},
對于每一個i
V-S
;④判斷:若S=V,
則算法結束,否則轉②。求每一對頂點之間的最短路徑問題的提法:已知一個各邊權值均大于0的帶權有向圖,對每一對頂點vi
vj,要求求出vi
與vj之間的最短路徑和最短路徑長度。
求每一對頂點之間的最短路徑方法一:每次以一個頂點為源點,重復執行Dijkstra算法n次——
T(n)=O(n3)方法二:弗洛伊德(Floyd)算法算法思想:逐個頂點試探法求最短路徑步驟初始時設置一個n階方陣,令其對角線元素為0,若存在弧<Vi,Vj>,則對應元素為權值;否則為逐步試著在原直接路徑中增加中間頂點,若加入中間點后路徑變短,則修改之;否則,維持原值所有頂點試探完畢,算法結束021264311041160230初始:路徑:0102101220046602370加入結點V1:路徑:010121012202010411602370加入結點V0:路徑:01021012202010465
0237
0加入結點V2:路徑:010121201220201拓撲排序
問題:
假設以有向圖表示一個工程的施工圖或程序的數據流圖,則圖中不允許出現回路。
檢查有向圖中是否存在回路的方法之一,是對有向圖進行拓撲排序。用頂點表示活動的網絡(AOV網)何謂“拓撲排序”?
按照有向圖給出的次序關系,將圖中頂點排成一個線性序列,即若<vi,vj>是圖中有向邊,則vi是vj的直接前驅;vj是vi的直接后繼。例如:對于下列有向圖BDAC可求得拓撲有序序列:
ABCD
或
ACBD由此所得頂點的線性序列稱之為拓撲有序序列BDAC反之,對于下列有向圖不能求得它的拓撲有序序列。因為圖中存在一個回路
{B,C,D}如何進行拓撲排序?一、從有向圖中選取一個沒有前驅的頂點,并輸出之;
重復上述兩步,直至圖空,或者圖不空但找不到無前驅的頂點為止。二、從有向圖中刪去此頂點以及所
有以它為尾的弧;abcghdfeabhcdgfe在算法中需要用定量的描述替代定性的概念
沒有前驅的頂點入度為零的頂點刪除頂點及以它為尾的弧弧頭頂點的入度減1算法描述以鄰接表作存儲結構把鄰接表中所有入度為0的頂點進棧棧非空時,輸出棧頂元素Vj并退棧;在鄰接表中查找Vj的直接后繼Vk,把Vk的入度減1;若Vk的入度為0則進棧重復上述操作直至??諡橹?。若棧空時輸出的頂點個數不是n,則有向圖有環;否則,拓撲排序完畢鄰接表結點:typedefstructnode{intvex;//頂點域
structnode*next;//鏈域}JD;表頭結點:typedefstructtnode{intin;//入度域
structnode*link;//鏈域}TD;TDg[M];//g[0]不用321041234560122inlink5543^^^vexnext3^25^240123456^160122inlink5543^^^vexnext3^25^240123456^輸出序列:6321041123456210112inlink5543^^^vexnext2^25^240123456^輸出序列:6132104112345604031310224055如果在無有向環的帶權有向圖中,用有向邊表示一個工程中的活動(Activity),
用邊上權值表示活動持續時間(Duration),
用頂點表示事件(Event),則這樣的有向圖叫做用邊表示活動的網絡,簡稱AOE(ActivityOnEdges)網絡。AOE網絡在某些工程估算方面非常有用。例如,可以使人們了解:完成整個工程至少需要多少時間(假設網絡中沒有環)?為縮短完成工程所需的時間,應當加快哪些活動?
5.7用邊表示活動的網絡(AOE網)問題:
假設以有向網表示一個施工流圖,弧上的權值表示完成該項子工程所需時間。問:哪些子工程項是“關鍵工程”?即:哪些子工程項將影響整個工程的完成期限。關鍵路徑整個工程完成的時間為:從有向圖的源點到匯點的最長路徑。abcdefghk64521187244例如:“關鍵活動”指的是關鍵路徑上的活動:該弧上的權值增加
將使有向圖上的最長路徑的長度增加。源點表示工程開始的狀態匯點表示工程結束的狀態6174任務進度時間參數說明最早開始時間ES(Earlystart)最晚開始時間LS(Latestart)最早完成時間EF(Earlyfinish)最晚完成時間LF(Latefinish)關鍵活動:該活動的最早開始時間=該活動的最遲開始時間,即活動的時間余量為0的時間“事件(頂點)”的最早可能發生時間ve(j)=從源點到頂點vj的最長路徑長度;v0v1v2v3v4v5v6v7v8a1=6a2=4a3=5a6=2a4=1a5=1a7=8a8=7a10=2a11=4a9=4“事件(頂點)”的最遲允許發生時間vl(j)=ve(匯點)-v(j)到匯點的最長路徑;
“活動(弧)”的最早可能開始時間e(i)=弧頭頂點的最早發生時間;“活動(弧)”的最遲開始時間l(i)=vl(弧頭)–活動的執行時間dut活動ai的時間余量=l(i)-e(i)chapter__396正推法實例StartLFLSEFES
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年浙江省寧波興寧中學初三暑期階段性考試化學試題含解析
- 護理安全文化建設
- 焦作市濟源市2025屆三年級數學第二學期期末教學質量檢測試題含解析
- 蘇州大學應用技術學院《公共體育2》2023-2024學年第二學期期末試卷
- 河北美術學院《食品毒理分析》2023-2024學年第二學期期末試卷
- 2025年湖南省岳陽市一中下學期高考原創信息試卷生物試題(三)含解析
- 溫州市洞頭縣2025屆五下數學期末學業質量監測模擬試題含答案
- 北京體育大學《光纖通信與數字傳輸》2023-2024學年第一學期期末試卷
- 福建省泉州市永春第二中學2025年高中畢業班第二次診斷性檢側(物理試題理)試題含解析
- 人教版八年級上冊第三單元《第2課 借物寓意》教學設計
- 中國大學生心理健康量表(CCSMHS)
- (本科)審計(第五版)全套教學課件完整版PPT
- GB∕T 3639-2021 冷拔或冷軋精密無縫鋼管
- 西師版六年級下冊數學第五單元 總復習 教案
- 拖欠貨款合同糾紛起訴狀范本
- 幼兒繪本故事:迪迪不想原諒人
- 碳酸丙烯酯法脫碳工藝工程設計
- 巧用繪本提升自閉癥兒童語言表達能力
- 計數型量具分析報告(Excel帶計算KAPPA公式)
- 譯林版六年級下冊英語期中試卷(江蘇南京江北新區2021年真卷含聽力答案)
- 獨生子女父母退休一次性獎勵審批1
評論
0/150
提交評論