數據結構 第6章 圖_第1頁
數據結構 第6章 圖_第2頁
數據結構 第6章 圖_第3頁
數據結構 第6章 圖_第4頁
數據結構 第6章 圖_第5頁
已閱讀5頁,還剩78頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2023年2月5日

數據結構

2023年2月5日

線性結構——一個對一個,如線性表、棧、隊列樹形結構——一個對多個,如樹集合——數據元素間除“同屬于一個集合”外,無其它關系圖形結構——多個對多個,如圖邏輯結構

2023年2月5日

第6章圖6.1

圖的定義和基本術語6.2

圖的存儲結構6.3

圖的遍歷6.4

圖的應用教學內容

2023年2月5日

1.掌握:圖的基本概念及相關術語和性質2.熟練掌握:圖的鄰接矩陣和鄰接表兩種存儲表示方法3.熟練掌握:圖的兩種遍歷方法DFS和BFS4.熟練掌握:最短路算法(Dijkstra算法)5.掌握:最小生成樹的兩種算法及拓撲排序算法的思想教學目標

2023年2月5日

6.1圖的定義和術語圖:Graph=(V,E)V:頂點(數據元素)的有窮非空集合;

E:邊的有窮集合。無向圖:有向圖:每條邊都是無方向的每條邊都是有方向的

2023年2月5日

完全圖:任意兩個點都有一條邊相連無向完全圖有向完全圖n(n-1)/2條邊n(n-1)條邊

2023年2月5日

稀疏圖:有很少邊或弧的圖。稠密圖:有較多邊或弧的圖。網:邊/弧帶權的圖。鄰接:有邊/弧相連的兩個頂點之間的關系。存在(vi,vj),則稱vi和vj互為鄰接點;存在<vi,vj>,則稱vi鄰接到vj,vj鄰接于vi

關聯(依附):邊/弧與頂點之間的關系。存在(vi,vj)/<vi,vj>,則稱該邊/弧關聯于vi和vj

2023年2月5日

頂點的度:與該頂點相關聯的邊的數目,記為TD(v)在有向圖中,頂點的度等于該頂點的入度與出度之和。頂點v的入度是以v為終點的有向邊的條數,記作ID(v)

頂點v的出度是以v為始點的有向邊的條數,記作OD(v)問:當有向圖中僅1個頂點的入度為0,其余頂點的入度均為1,此時是何形狀?答:是樹!而且是一棵有向樹!

2023年2月5日

路徑:接續(xù)的邊構成的頂點序列。路徑長度:路徑上邊或弧的數目/權值之和?;芈?環(huán)):第一個頂點和最后一個頂點相同的路徑。簡單路徑:除路徑起點和終點可以相同外,其余頂點均不相同的路徑。簡單回路(簡單環(huán)):除路徑起點和終點相同外,其余頂點均不相同的路徑。

2023年2月5日

非連通圖

連通圖

強連通圖

非強連通圖

V0

V1

V2

V3

V0

V4

V3

V1

V2

V0

V1

V2

V3

V0

V2

V3

V1

V5

V4連通圖(強連通圖)在無(有)向圖G=(V,{E})中,若對任何兩個頂點v、u都存在從v到u的路徑,則稱G是連通圖(強連通圖)。

2023年2月5日

(a)(b)(c)

V0

V4

V3

V1

V2

V0

V4

V3

V1

V2

V0

V4

V3

V1

V2子圖設有兩個圖G=(V,{E})、G1=(V1,{E1}),若V1V,E1E,則稱G1是G的子圖。

例:(b)、(c)是(a)的子圖權與網圖中邊或弧所具有的相關數稱為權。表明從一個頂點到另一個頂點的距離或耗費。帶權的圖稱為網。

2023年2月5日

連通分量(強連通分量)非連通圖

V0

V2

V3

V1

V5

V4無向圖G的極大連通子圖稱為G的連通分量。

極大連通子圖意思是:該子圖是G連通子圖,將G的任何不在該子圖中的頂點加入,子圖不再連通。

V0

V2

V3

V1

V5

V4連通分量

2023年2月5日

有向圖G的極大強連通子圖稱為G的強連通分量。極大強連通子圖意思是:該子圖是G的強連通子圖,將D的任何不在該子圖中的頂點加入,子圖不再是強連通的。強連通分量

V0

V1

V2

V3

V0

V2

V3

V1

2023年2月5日

極小連通子圖:該子圖是G的連通子圖,在該子圖中刪除任何一條邊,子圖不再連通。

生成樹:包含無向圖G所有頂點的極小連通子圖。生成森林:對非連通圖,由各個連通分量的生成樹的集合。連通圖G1G1的生成樹

V0

V4

V3

V1

V2

V0

V4

V3

V1

V2

V0

V4

V3

V1

V2

2023年2月5日

6.2圖的存儲結構鄰接表鄰接多重表十字鏈表鏈式存儲結構:順序存儲結構:數組表示法(鄰接矩陣)多重鏈表重點介紹:鄰接矩陣(數組)表示法鄰接表(鏈式)表示法

2023年2月5日

建立一個頂點表(記錄各個頂點信息)和一個鄰接矩陣(表示各個頂點之間關系)。設圖A=(V,E)有n

個頂點,則圖的鄰接矩陣是一個二維數組A.Edge[n][n],定義為:數組(鄰接矩陣)表示法

2023年2月5日

鄰接矩陣:A.Edge=(v1v2

v3v4v5)v1v2v3v4v500

0

0000

0000

00000000000000分析1:無向圖的鄰接矩陣是對稱的;分析2:頂點i

的度=第i

行(列)中1的個數;特別:完全圖的鄰接矩陣中,對角元素為0,其余1。01

0

1010

1010

101110101011

1001

0

1010

1

010

1

01110101011

10頂點表:無向圖的鄰接矩陣表示法v1v2v3v5v4v4

2023年2月5日

分析1:有向圖的鄰接矩陣可能是不對稱的。分析2:頂點的出度=第i行元素之和頂點的入度=第i列元素之和頂點的度=第i行元素之和+第i列元素之和

v1v2v3v4A鄰接矩陣:A.Edge=(v1v2

v3v4)v1v2v3v400

0

000

000

0000000注:在有向圖的鄰接矩陣中,第i行含義:以結點vi為尾的弧(即出度邊);第i列含義:以結點vi為頭的弧(即入度邊)。頂點表:01

1

000

000

0

01

1

00001

1

000

000

0

01

1

000有向圖的鄰接矩陣表示法

2023年2月5日

定義為:A.Edge[i][j]=Wij

<vi,vj>或(vi,vj)∈VR∞

無邊(?。﹙1v2v3v4Nv5v65489755613鄰接矩陣:∞

∞∞

∞∞

∞∞

∞∞

∞∞

∞∞

∞∞

∞∞

∞∞

∞∞

∞∞

∞N.Edge=(v1v2

v3v4v5v6

)頂點表:

5

7

4

8

9

5

6

5

3

1

5

7

∞∞

4

8

∞∞

9∞

5∞

6∞

5

3

∞∞

1

∞網(即有權圖)的鄰接矩陣表示法

2023年2月5日

優(yōu)點:容易實現圖的操作,如:求某頂點的度、判斷頂點之間是否有邊、找頂點的鄰接點等等。缺點:n個頂點需要n*n個單元存儲邊;空間效率為O(n2)。對稀疏圖而言尤其浪費空間。鄰接矩陣表示法的特點

2023年2月5日

//用兩個數組分別存儲頂點表和鄰接矩陣#defineMaxInt32767 //表示極大值,即∞#defineMVNum100 //最大頂點數typedefcharVerTexType; //假設頂點的數據類型為字符型typedef

int

ArcType; //假設邊的權值類型為整型typedef

struct{

VerTexType

vexs[MVNum]; //頂點表

ArcType

arcs[MVNum][MVNum]; //鄰接矩陣

int

vexnum,arcnum; //圖的當前點數和邊數}AMGraph;鄰接矩陣的存儲表示

2023年2月5日

(1)輸入總頂點數和總邊數。(2)依次輸入點的信息存入頂點表中。(3)初始化鄰接矩陣,使每個權值初始化為極大值。(4)構造鄰接矩陣。

【算法思想】采用鄰接矩陣表示法創(chuàng)建無向網

2023年2月5日

StatusCreateUDN(AMGraph&G){//采用鄰接矩陣表示法,創(chuàng)建無向網G

cin>>G.vexnum>>G.arcnum; //輸入總頂點數,總邊數

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

cin>>G.vexs[i]; //依次輸入點的信息

for(i=0;i<G.vexnum;++i) //初始化鄰接矩陣,邊的權值均置為極大值for(j=0;j<G.vexnum;++j)

G.arcs[i][j]=MaxInt;

for(k=0;k<G.arcnum;++k){//構造鄰接矩陣

cin>>v1>>v2>>w;

//輸入一條邊依附的頂點及權值

i=LocateVex(G,v1);j=LocateVex(G,v2);//確定v1和v2在G中的位置G.arcs[i][j]=w;

//邊<v1,v2>的權值置為w

G.arcs[j][i]=G.arcs[i][j];

//置<v1,v2>的對稱邊<v2,v1>的權值為w}//forreturnOK;}//CreateUDN

【算法描述】

2023年2月5日

int

LocateVex(MGraph

G,VertexTypeu){/*初始條件:圖G存在,u和G中頂點有相同特征*//*操作結果:若G中存在頂點u,則返回該頂點在圖中位置;否則返回-1*/

inti;

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

if(u==G.vexs[i])returni;return-1;}

2023年2月5日

對每個頂點vi建立一個單鏈表,把與vi有關聯的邊的信息鏈接起來,每個結點設為3個域;每個單鏈表有一個頭結點(設為2個域),存vi信息;adjvexnextarcinfodatafirstarc表結點頭結點鄰接點域,表示vi一個鄰接點的位置鏈域,指向vi下一個邊或弧的結點數據域,與邊有關信息(如權值)數據域,存儲頂點vi

信息鏈域,指向單鏈表的第一個結點

每個單鏈表的頭結點另外用順序存儲結構存儲。鄰接表(鏈式)表示法

2023年2月5日

01234^1334^142^0注:鄰接表不唯一,因各個邊結點的鏈入順序是任意的v1v2v3v4v523^142^0無向圖的鄰接表表示空間效率為O(n+2e)。若是稀疏圖(e<<n2),比鄰接矩陣表示法O(n2)省空間。TD(Vi)=單鏈表中鏈接的結點個數v1v2v3v5v4v4

2023年2月5日

v1v2v3v4V4V3^V2V12^3^0^1鄰接表(出邊)V4V3V2V1^3^0^2^0逆鄰接表(入邊)有向圖的鄰接表表示空間效率為O(n+e)出度入度度:OD(Vi)=單鏈出邊表中鏈接的結點數ID(Vi)=鄰接點域為Vi的弧個數TD(Vi)=OD(Vi)+ID(Vi)

2023年2月5日

8064125當鄰接表的存儲結構形成后,圖便唯一確定!已知某網的鄰接(出邊)表,請畫出該網絡。

2023年2月5日

#defineMVNum100 //最大頂點數typedef

struct

ArcNode{ //邊結點

int

adjvex; //該邊所指向的頂點的位置

struct

ArcNode*nextarc;

//指向下一條邊的指針

OtherInfoinfo; //和邊相關的信息}ArcNode;typedef

struct

VNode{

VerTexTypedata; //頂點信息

ArcNode*firstarc; //指向第一條依附該頂點的邊的指針}VNode,AdjList[MVNum]; //AdjList表示鄰接表類型typedef

struct{

AdjListvertices; //鄰接表

int

vexnum,arcnum; //圖的當前頂點數和邊數}ALGraph;鄰接表的存儲表示

2023年2月5日

(1)輸入總頂點數和總邊數。(2)依次輸入點的信息存入頂點表中,使每個表頭結點的指針域初始化為NULL。(3)創(chuàng)建鄰接表。【算法思想】采用鄰接表表示法創(chuàng)建無向網

2023年2月5日

StatusCreateUDG(ALGraph&G){

//采用鄰接表表示法,創(chuàng)建無向圖G

cin>>G.vexnum>>G.arcnum; //輸入總頂點數,總邊數

for(i=0;i<G.vexnum;++i){ //輸入各點,構造表頭結點表

cin>>G.vertices[i].data; //輸入頂點值

G.vertices[i].firstarc=NULL; //初始化表頭結點的指針域為NULL}//for

for(k=0;k<G.arcnum;++k){ //輸入各邊,構造鄰接表

cin>>v1>>v2; //輸入一條邊依附的兩個頂點

i=LocateVex(G,v1);j=LocateVex(G,v2);p1=newArcNode; //生成一個新的邊結點*p1

p1->adjvex=j; //鄰接點序號為j

p1->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p1;//將新結點*p1插入頂點vi的邊表頭部

p2=newArcNode;//生成另一個對稱的新的邊結點*p2

p2->adjvex=i; //鄰接點序號為i

p2->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p2;//將新結點*p2插入頂點vj的邊表頭部

}//forreturnOK;}//CreateUDG

【算法描述】

2023年2月5日

優(yōu)點:空間效率高,容易尋找頂點的鄰接點;缺點:判斷兩頂點間是否有邊或弧,需搜索兩結點對應的單鏈表,沒有鄰接矩陣方便。鄰接表表示法的特點

2023年2月5日

v1v2v3v5v4v443210^1334^142^0v5v4v3v2v123^142^0(v1v2

v3v4v5)v1v2v3v4v500

0

0000

0000

0000000000000001

0

1010

1010

101110101011

1001

0

1010

1

010

1

01110101011

10鄰接矩陣與鄰接表表示法的關系1.聯系:鄰接表中每個鏈表對應于鄰接矩陣中的一行,鏈表中結點個數等于一行中非零元素的個數。

2023年2月5日

2.區(qū)別:①對于任一確定的無向圖,鄰接矩陣是唯一的(行列號與頂點編號一致),但鄰接表不唯一(鏈接次序與頂點編號無關)。②鄰接矩陣的空間復雜度為O(n2),而鄰接表的空間復雜度為O(n+e)。3.用途:鄰接矩陣多用于稠密圖;而鄰接表多用于稀疏圖鄰接矩陣與鄰接表表示法的關系

2023年2月5日

遍歷定義:從已給的連通圖中某一頂點出發(fā),沿著一些邊訪遍圖中所有的頂點,且使每個頂點僅被訪問一次,就叫做圖的遍歷,它是圖的基本運算。遍歷實質:找每個頂點的鄰接點的過程。圖的特點:圖中可能存在回路,且圖的任一頂點都可能與其它頂點相通,在訪問完某個頂點之后可能會沿著某些邊又回到了曾經訪問過的頂點。6.3圖的遍歷

2023年2月5日

圖常用的遍歷:深度優(yōu)先搜索廣度優(yōu)先搜索解決思路:設置輔助數組

visited[n],用來標記每個被訪問過的頂點。初始狀態(tài)為0i

被訪問,改visited[i]為1,防止被多次訪問怎樣避免重復訪問?

2023年2月5日

基本思想:——仿樹的先序遍歷過程。v1v1v2v3v8v7v6v4v5DFS結果→→→→→→→v2v4v8v5v3v6v7起點深度優(yōu)先搜索(DFS-Depth_FirstSearch)

2023年2月5日

深度優(yōu)先搜索的步驟簡單歸納:訪問起始點v;若v的第1個鄰接點沒訪問過,深度遍歷此鄰接點;若當前鄰接點已訪問過,再找v的第2個鄰接點重新遍歷。

2023年2月5日

深度優(yōu)先搜索的步驟詳細歸納:在訪問圖中某一起始頂點

v

后,由

v出發(fā),訪問它的任一鄰接頂點

w1;再從

w1出發(fā),訪問與

w1鄰接但還未被訪問過的頂點

w2;然后再從

w2出發(fā),進行類似的訪問,…

如此進行下去,直至到達所有的鄰接頂點都被訪問過的頂點

u為止。起點

2023年2月5日

深度優(yōu)先搜索的步驟詳細歸納:接著,退回一步,退到前一次剛訪問過的頂點,看是否還有其它沒有被訪問的鄰接頂點。

如果有,則訪問此頂點,之后再從此頂點出發(fā),進行與前述類似的訪問;

如果沒有,就再退回一步進行搜索。重復上述過程,直到連通圖中所有頂點都被訪問過為止。起點v2→v1→v3→v5→v4→v6

2023年2月5日

討論1:計算機如何實現DFS?123456100000020000003000000400000050000006000000000000123456010000110000111000111010111110111111DFS結果鄰接矩陣A輔助數組visited[n]起點v2→v1→v3→v5→v4→v6——開輔助數組

visited[n]!123456101110021000103100010410000150110006000100

2023年2月5日

voidDFS(AMGraphG,intv){ //圖G為鄰接矩陣類型

cout<<v;visited[v]=true; //訪問第v個頂點

for(w=0;w<G.vexnum;w++) //依次檢查鄰接矩陣v所在的行

if((G.arcs[v][w]!=0)&&(!visited[w]))DFS(G,w);//w是v的鄰接點,如果w未訪問,則遞歸調用DFS}討論2:DFS算法如何編程?——可以用遞歸算法!

2023年2月5日

討論3:在圖的鄰接表中如何進行DFS?v0→v1→v2→v3DFS結果00000123輔助數組visited[n]1000110011101111—照樣借用visited[n]!起點0123

2023年2月5日

討論4:鄰接表的DFS算法如何編程?voidDFS(ALGraphG,intv){ //圖G為鄰接表類型

cout<<v;visited[v]=true; //訪問第v個頂點

p=G.vertices[v].firstarc;//p指向v的邊鏈表的第一個邊結點while(p!=NULL){ //邊結點非空

w=p->adjvex; //表示w是v的鄰接點

if(!visited[w])DFS(G,w); //如果w未訪問,則遞歸調用DFSp=p->nextarc; //p指向下一個邊結點

}}——仍可用遞歸算法

2023年2月5日

用鄰接矩陣來表示圖,遍歷圖中每一個頂點都要從頭掃描該頂點所在行,時間復雜度為O(n2)。用鄰接表來表示圖,雖然有2e

個表結點,但只需掃描e個結點即可完成遍歷,加上訪問n個頭結點的時間,時間復雜度為O(n+e)。結論:稠密圖適于在鄰接矩陣上進行深度遍歷;稀疏圖適于在鄰接表上進行深度遍歷。DFS算法效率分析

2023年2月5日

基本思想:——仿樹的層次遍歷過程廣度優(yōu)先搜索(BFS-Breadth_FirstSearch)v1v1v2v3v8v7v6v4v5BFS結果→→→→v2v3→v4v5→v6v7→v8起點

2023年2月5日

簡單歸納:在訪問了起始點v之后,依次訪問v的鄰接點;然后再依次訪問這些頂點中未被訪問過的鄰接點;直到所有頂點都被訪問過為止。廣度優(yōu)先搜索是一種分層的搜索過程,每向前走一步可能訪問一批頂點,不像深度優(yōu)先搜索那樣有回退的情況。因此,廣度優(yōu)先搜索不是一個遞歸的過程,其算法也不是遞歸的。廣度優(yōu)先搜索的步驟

2023年2月5日

討論1:計算機如何實現BFS?鄰接表—除輔助數組visited[n]外,還需再開一輔助隊列起點輔助隊列v2已訪問過了BFS遍歷結果入隊!初始f=n-1,r=0

2023年2月5日

(1)從圖中某個頂點v出發(fā),訪問v,并置visited[v]的值為true,然后將v進隊。(2)只要隊列不空,則重復下述處理。①隊頭頂點u出隊。②依次檢查u的所有鄰接點w,如果visited[w]的值為false,則訪問w,并置visited[w]的值為true,然后將w進隊?!舅惴ㄋ枷搿?/p>

2023年2月5日

voidBFS(GraphG,intv){//按廣度優(yōu)先非遞歸遍歷連通圖G

cout<<v;visited[v]=true; //訪問第v個頂點

InitQueue(Q); //輔助隊列Q初始化,置空

EnQueue(Q,v); //v進隊

while(!QueueEmpty(Q)){ //隊列非空

DeQueue(Q,u); //隊頭元素出隊并置為u

for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))

if(!visited[w]){ //w為u的尚未訪問的鄰接頂點

cout<<w;visited[w]=true; EnQueue(Q,w);//w進隊

}//if}//while}//BFS

【算法描述】

2023年2月5日

如果使用鄰接矩陣,則BFS對于每一個被訪問到的頂點,都要循環(huán)檢測矩陣中的整整一行(

n個元素),總的時間代價為O(n2)。用鄰接表來表示圖,雖然有2e個表結點,但只需掃描e個結點即可完成遍歷,加上訪問n個頭結點的時間,時間復雜度為O(n+e)。BFS算法效率分析

2023年2月5日

空間復雜度相同,都是O(n)(借用了堆?;蜿犃校粫r間復雜度只與存儲結構(鄰接矩陣或鄰接表)有關,而與搜索路徑無關。DFS與BFS算法效率比較

2023年2月5日

最小生成樹最短路徑拓撲排序關鍵路徑6.4圖的應用

2023年2月5日

極小連通子圖:該子圖是G的連通子圖,在該子圖中刪除任何一條邊,子圖不再連通。生成樹:包含圖G所有頂點的極小連通子圖(n-1條邊)。G1的生成樹連通圖G1

V0

V4

V3

V1

V2

V0

V4

V3

V1

V2

V0

V4

V3

V1

V2最小生成樹

2023年2月5日

DFS生成樹鄰接表01234^1334^142^0v4v3v2v1v023^142^0v0v2v1v4v3BFS生成樹v0v1v3v2v4無向連通圖畫出下圖的生成樹v0v1v2v4v4v3

2023年2月5日

求最小生成樹首先明確:使用不同的遍歷圖的方法,可以得到不同的生成樹從不同的頂點出發(fā),也可能得到不同的生成樹。按照生成樹的定義,n個頂點的連通網絡的生成樹有n個頂點、n-1條邊。目標:在網的多個生成樹中,尋找一個各邊權值之和最小的生成樹

2023年2月5日

必須只使用該網中的邊來構造最小生成樹;必須使用且僅使用n-1條邊來聯結網絡中的n個頂點不能使用產生回路的邊構造最小生成樹的準則

2023年2月5日

欲在n個城市間建立通信網,則n個城市應鋪n-1條線路;但因為每條線路都會有對應的經濟成本,而n個城市可能有n(n-1)/2條線路,那么,如何選擇n–1條線路,使總費用最少?數學模型:頂點———表示城市,有n個;邊————表示線路,有n–1條;邊的權值—表示線路的經濟代價;連通網——表示n個城市間通信網。顯然此連通網是一個生成樹!最小生成樹的典型用途

2023年2月5日

Prim(普里姆)算法Kruskal(克魯斯卡爾)算法Prime算法:

歸并頂點,與邊數無關,適于稠密網Kruskal算法:歸并邊,適于稀疏網如何求最小生成樹

2023年2月5日

設連通網絡N={V,E}1.從某頂點u0

出發(fā),選擇與它關聯的具有最小權值的邊(u0,v),將其頂點加入到生成樹的頂點集合U中2.每一步從一個頂點在U中,而另一個頂點不在U中的各條邊中選擇權值最小的邊(u,v),把它的頂點加入到U中3.直到所有頂點都加入到生成樹頂點集合U中為止普里姆算法的基本思想--歸并頂點

2023年2月5日

應用普里姆算法構造最小生成樹的過程

2023年2月5日

設連通網絡N={V,E}1.構造一個只有n個頂點,沒有邊的非連通圖T={V,},每個頂點自成一個連通分量2.在E中選最小權值的邊,若該邊的兩個頂點落在不同的連通分量上,則加入T中;否則舍去,重新選擇3.重復下去,直到所有頂點在同一連通分量上為止克魯斯卡爾算法的基本思想-歸并邊

2023年2月5日

應用克魯斯卡爾算法構造最小生成樹的過程√√√√×√×√

2023年2月5日

用有向圖來描述一個工程或系統(tǒng)的進行過程。一個工程可以分為若干個子工程,只要完成了這些子工程(活動),就可以導致整個工程的完成。①AOV網(ActivityOnVertices)—用頂點表示活動的網絡②AOE網(ActivityOnEdges)—用邊表示活動的網絡比如教學計劃的制定哪些課程是必須先修的,哪些課程是可以并行學習的。有向無環(huán)圖及其應用

2023年2月5日

C1

高等數學

C2

程序設計基礎

C3

離散數學C1,C2

C4

數據結構C3,C2C5

高級語言程序設計C2C6

編譯方法C5,C4C7

操作系統(tǒng)C4,C9C8

普通物理C1C9

計算機原理C8

課程代號課程名稱先修課程

2023年2月5日

學生課程學習工程圖數據結構離散數學程序設計基礎對學生選課工程圖進行拓撲排序,得到的拓撲有序序列為C1,C2,C3,C4,C5,C6,C8,C9,C7

或C1,C8,C9,C2,C5,C3,C4,C7,C6

2023年2月5日

輸入AOV網絡。令n為頂點個數。 在AOV網絡中選一個沒有直接前驅的頂點,并輸出之;

從圖中刪去該頂點,同時刪去所有它發(fā)出的有向邊;

重復以上2、3步,直到:全部頂點均已輸出,拓撲有序序列形成,拓撲排序完成;或:圖中還有未輸出的頂點,但已跳出處理循環(huán)。這說明圖中還剩下一些頂點,它們都有直接前驅,再也找不到沒有前驅的頂點了。這時AOV網絡中必定存在有向環(huán)。拓撲排序算法的思想-重復選擇沒有直接前驅的頂點

2023年2月5日

拓撲排序的過程

2023年2月5日

最后得到拓撲序列

C4,C0,C3,C2,C1,C5

。滿足圖中給出的所有前驅和后繼關系,對于本來沒有這種關系的頂點,如C4和C2,也排出了先后次序關系。

2023年2月5日

典型用途:交通問題。如:城市A到城市B有多條線路,但每條線路的交通費(或所需時間)不同,那么,如何選擇一條線路,使總費用(或總時間)最少?問題抽象:在帶權有向圖中A點(源點)到達B點(終點)的多條路徑中,尋找一條各邊權值之和最小的路徑,即最短路徑。(注:最短路徑與最小生成樹不同,路徑上不一定包含n個頂點)最短路徑

2023年2月5日

一頂點到其余各頂點兩種常見的最短路徑問題:一、單源最短路徑—用Dijkstra(迪杰斯特拉)算法二、所有頂點間的最短路徑—用Floyd(弗洛伊德)算法任意兩頂點之間

2023年2月5日

目的:

設一有向圖G=(V,E),已知各邊的權值,以某指定點v0為源點,求從v0到圖的其余各點的最短路徑。限定各邊上的權值大于或等于0。源點從F→A的路徑有4條:①F→A:24②F→B→A:5+18=23③F→B→C→A:5+7+9=21④

F→D→C→A:25+12+9=36又:從F→B的最短路徑是哪條?從F→C的最短路徑是哪條?單源最短路徑問題(Dijkstra算法)

2023年2月5日

v0(v0,v1)10源點終點

短路

徑路徑長度(v0,v1,v2)(v0,v3,v2)(v0,v3)30

v1

v2

v3

v4100(v0,v4)(v0,v3,v4)(v0,v3,v2,v4)例2:6001234509070討論:計算機如何自動求出這些最短路徑?(v0,v1,v2,v4)60

2023年2月5日

先找出從源點v0到各終點vk的直達路徑(v0,vk),即通過一條弧到達的路徑。從這些路徑中找出一條長度最短的路徑(v0,u),然后對其余各條路徑進行適當調整:若在圖中存在?。╱,vk),且(v0,u)+(u,vk)<(v0,vk),則以路徑(v0,u,vk)代替(v0,vk)。在調整后的各條路徑中,再找長度最短的路徑,依此類推。Dijkstra算法的思想

2023年2月5日

①初始化:● 將源點v0加到S中,即S[v0]

=

true;● 將v0到各個終點的最短路徑長度初始化為權值,即D[i]

=

G.arcs[v0][vi],(vi∈V

?

S);● 如果v0和頂點vi之間有弧,則將vi的前驅置為v0,即Path[i]

=

v0,否則Path[i]

=

?1。②選擇下一條最短路徑的終點vk,使得:

D[k]

=

Min{D[i]|vi∈V

?

S}【算法思想】

2023年2月5日

③將vk加到S中,即S[vk]

=

true。④更新從v0出發(fā)到集合V

?

S上任一頂點的最短路徑的長度,同時更改vi的前驅為vk。若D[k]+G.arcs[k][i]<D[i],則D[i]=D[k]+G.arcs[k][i];Path[i]=k;。⑤重復②~④

n

?

1次,即可按照路徑長度的遞增順序,逐個求得從v0到圖上其余各頂點的最短路徑?!舅惴ㄋ枷搿?/p>

2023年2月5日

2023年2月5日

(v0,v2)+(v2,v3)<(v0,v3)終點

從v0到各終點的dist值和最短路徑v1v2v3v4v5vjS之外的當前最短路徑之頂點60{v0,v2,v3}50{v0,v4,v3}30{v0,v4}90{v0,v4,v5}60{v0,v4,v3,v5}5540312100603010102050s{v0,v2}{v0,v2,v4}{v0,v2,v4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論