版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)三、圖的遍歷操作一、 目的掌握有向圖和無向圖的概念;掌握鄰接矩陣和鄰接鏈表建立圖的存儲(chǔ)結(jié)構(gòu);掌握DFS及BFS對(duì)圖的遍歷操作;了解圖結(jié)構(gòu)在人工智能、工程等領(lǐng)域的廣泛應(yīng)用。二、 要求采用鄰接矩陣和鄰接鏈表作為圖的存儲(chǔ)結(jié)構(gòu),完成有向圖和無向圖的DFS和BFS操作。三、 DFS和BFS 的基本思想深度優(yōu)先搜索法DFS的基本思想:從圖G中某個(gè)頂點(diǎn)Vo出發(fā),首先訪問Vo,然后選擇一個(gè)與Vo相鄰且沒被訪問過的頂點(diǎn)Vi訪問,再從Vi出發(fā)選擇一個(gè)與Vi相鄰且沒被訪問過的頂點(diǎn)Vj訪問,依次繼續(xù)。如果當(dāng)前被訪問過的頂點(diǎn)的所有鄰接頂點(diǎn)都已被訪問,則回退到已被訪問的頂點(diǎn)序列中最后一個(gè)擁有未被訪問的相鄰頂點(diǎn)的頂點(diǎn)W
2、,從W出發(fā)按同樣方法向前遍歷。直到圖中所有的頂點(diǎn)都被訪問。廣度優(yōu)先算法BFS的基本思想:從圖G中某個(gè)頂點(diǎn)Vo出發(fā),首先訪問Vo,然后訪問與Vo相鄰的所有未被訪問過的頂點(diǎn)V1,V2,Vt;再依次訪問與V1,V2,Vt相鄰的起且未被訪問過的的所有頂點(diǎn)。如此繼續(xù),直到訪問完圖中的所有頂點(diǎn)。四、 示例程序1 鄰接矩陣作為存儲(chǔ)結(jié)構(gòu)的程序示例#include"stdio.h"#include"stdlib.h"#define MaxVertexNum 100 /定義最大頂點(diǎn)數(shù)typedef struct char vexsMaxVertexNum; /頂點(diǎn)表 int
3、 edgesMaxVertexNumMaxVertexNum; /鄰接矩陣,可看作邊表 int n,e; /圖中的頂點(diǎn)數(shù)n和邊數(shù)eMGraph; /用鄰接矩陣表示的圖的類型/=建立鄰接矩陣=void CreatMGraph(MGraph *G) int i,j,k; char a; printf("Input VertexNum(n) and EdgesNum(e): "); scanf("%d,%d",&G->n,&G->e); /輸入頂點(diǎn)數(shù)和邊數(shù) scanf("%c",&a); printf(&
4、quot;Input Vertex string:"); for(i=0;i<G->n;i+) scanf("%c",&a); G->vexsi=a; /讀入頂點(diǎn)信息,建立頂點(diǎn)表 for(i=0;i<G->n;i+)for(j=0;j<G->n;j+)G->edgesij=0; /初始化鄰接矩陣 printf("Input edges,Creat Adjacency Matrixn"); for(k=0;k<G->e;k+) /讀入e條邊,建立鄰接矩陣 scanf("
5、%d%d",&i,&j); /輸入邊(Vi,Vj)的頂點(diǎn)序號(hào) G->edgesij=1; G->edgesji=1; /若為無向圖,矩陣為對(duì)稱矩陣;若建立有向圖,去掉該條語句 /=定義標(biāo)志向量,為全局變量=typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度優(yōu)先遍歷的遞歸算法=void DFSM(MGraph *G,int i) /以Vi為出發(fā)點(diǎn)對(duì)鄰接矩陣表示的圖G進(jìn)行DFS搜索,鄰接矩陣是0,1矩陣 int j; printf("%c",G->ve
6、xsi); /訪問頂點(diǎn)Vi visitedi=TRUE; /置已訪問標(biāo)志 for(j=0;j<G->n;j+) /依次搜索Vi的鄰接點(diǎn)if(G->edgesij=1 && ! visitedj) DFSM(G,j); /(Vi,Vj)E,且Vj未訪問過,故Vj為新出發(fā)點(diǎn)void DFS(MGraph *G) int i; for(i=0;i<G->n;i+)visitedi=FALSE; /標(biāo)志向量初始化 for(i=0;i<G->n;i+)if(!visitedi) /Vi未訪問過 DFSM(G,i); /以Vi為源點(diǎn)開始DFS搜索/
7、=BFS:廣度優(yōu)先遍歷=void BFS(MGraph *G,int k) /以Vk為源點(diǎn)對(duì)用鄰接矩陣表示的圖G進(jìn)行廣度優(yōu)先搜索 int i,j,f=0,r=0; int cqMaxVertexNum; /定義隊(duì)列 for(i=0;i<G->n;i+)visitedi=FALSE; /標(biāo)志向量初始化 for(i=0;i<G->n;i+)cqi=-1; /隊(duì)列初始化 printf("%c",G->vexsk); /訪問源點(diǎn)Vk visitedk=TRUE; cqr=k; /Vk已訪問,將其入隊(duì)。注意,實(shí)際上是將其序號(hào)入隊(duì) while(cqf!=-
8、1) /隊(duì)非空則執(zhí)行 i=cqf; f=f+1; /Vf出隊(duì) for(j=0;j<G->n;j+) /依次Vi的鄰接點(diǎn)Vj if(G->edgesij=1 && !visitedj) /Vj未訪問 printf("%c",G->vexsj); /訪問Vj visitedj=TRUE; r=r+1; cqr=j; /訪問過Vj入隊(duì) /=main=void main() int i; MGraph *G; G=(MGraph *)malloc(sizeof(MGraph); /為圖G申請(qǐng)內(nèi)存空間 CreatMGraph(G); /建立鄰接
9、矩陣 printf("Print Graph DFS: "); DFS(G); /深度優(yōu)先遍歷 printf("n"); printf("Print Graph BFS: "); BFS(G,3); /以序號(hào)為3的頂點(diǎn)開始廣度優(yōu)先遍歷 printf("n");執(zhí)行順序:V6V4V5V7V2V3V1V0Vo圖G的示例Input VertexNum(n) and EdgesNum(e): 8,9Input Vertex string: 01234567Input edges,Creat Adjacency Matrix
10、0 10 21 31 42 52 63 74 75 6Print Graph DFS:01374256Print Graph BFS:317042562 鄰接鏈表作為存儲(chǔ)結(jié)構(gòu)程序示例#include"stdio.h"#include"stdlib.h"#define MaxVertexNum 50 /定義最大頂點(diǎn)數(shù)typedef struct node /邊表結(jié)點(diǎn) int adjvex; /鄰接點(diǎn)域 struct node *next; /鏈域EdgeNode;typedef struct vnode /頂點(diǎn)表結(jié)點(diǎn) char vertex; /頂點(diǎn)域 E
11、dgeNode *firstedge; /邊表頭指針VertexNode;typedef VertexNode AdjListMaxVertexNum; /AdjList是鄰接表類型typedef struct AdjList adjlist; /鄰接表 int n,e; /圖中當(dāng)前頂點(diǎn)數(shù)和邊數(shù) ALGraph; /圖類型/=建立圖的鄰接表=void CreatALGraph(ALGraph *G) int i,j,k; char a; EdgeNode *s; /定義邊表結(jié)點(diǎn) printf("Input VertexNum(n) and EdgesNum(e): ");
12、scanf("%d,%d",&G->n,&G->e); /讀入頂點(diǎn)數(shù)和邊數(shù) scanf("%c",&a); printf("Input Vertex string:"); for(i=0;i<G->n;i+) /建立邊表 scanf("%c",&a);G->adjlisti.vertex=a; /讀入頂點(diǎn)信息G->adjlisti.firstedge=NULL; /邊表置為空表 printf("Input edges,Creat Adja
13、cency Listn"); for(k=0;k<G->e;k+) /建立邊表 scanf("%d%d",&i,&j); /讀入邊(Vi,Vj)的頂點(diǎn)對(duì)序號(hào)s=(EdgeNode *)malloc(sizeof(EdgeNode); /生成邊表結(jié)點(diǎn)s->adjvex=j; /鄰接點(diǎn)序號(hào)為js->next=G->adjlisti.firstedge;G->adjlisti.firstedge=s; /將新結(jié)點(diǎn)*S插入頂點(diǎn)Vi的邊表頭部s=(EdgeNode *)malloc(sizeof(EdgeNode); s-
14、>adjvex=i; /鄰接點(diǎn)序號(hào)為is->next=G->adjlistj.firstedge; G->adjlistj.firstedge=s; /將新結(jié)點(diǎn)*S插入頂點(diǎn)Vj的邊表頭部 /=定義標(biāo)志向量,為全局變量=typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度優(yōu)先遍歷的遞歸算法=void DFSM(ALGraph *G,int i) /以Vi為出發(fā)點(diǎn)對(duì)鄰接鏈表表示的圖G進(jìn)行DFS搜索 EdgeNode *p; printf("%c",G->adjlist
15、i.vertex); /訪問頂點(diǎn)Vi visitedi=TRUE; /標(biāo)記Vi已訪問 p=G->adjlisti.firstedge; /取Vi邊表的頭指針 while(p) /依次搜索Vi的鄰接點(diǎn)Vj,這里j=p->adjvexif(! visitedp->adjvex) /若Vj尚未被訪問 DFSM(G,p->adjvex); /則以Vj為出發(fā)點(diǎn)向縱深搜索p=p->next; /找Vi的下一個(gè)鄰接點(diǎn) void DFS(ALGraph *G) int i; for(i=0;i<G->n;i+)visitedi=FALSE; /標(biāo)志向量初始化 for(
16、i=0;i<G->n;i+)if(!visitedi) /Vi未訪問過 DFSM(G,i); /以Vi為源點(diǎn)開始DFS搜索/=BFS:廣度優(yōu)先遍歷=void BFS(ALGraph *G,int k) /以Vk為源點(diǎn)對(duì)用鄰接鏈表表示的圖G進(jìn)行廣度優(yōu)先搜索 int i,f=0,r=0; EdgeNode *p; int cqMaxVertexNum; /定義FIFO隊(duì)列 for(i=0;i<G->n;i+)visitedi=FALSE; /標(biāo)志向量初始化 for(i=0;i<=G->n;i+)cqi=-1; /初始化標(biāo)志向量 printf("%c&q
17、uot;,G->adjlistk.vertex); /訪問源點(diǎn)Vk visitedk=TRUE; cqr=k; /Vk已訪問,將其入隊(duì)。注意,實(shí)際上是將其序號(hào)入隊(duì) while(cqf!=-1) 隊(duì)列非空則執(zhí)行i=cqf; f=f+1; /Vi出隊(duì)p=G->adjlisti.firstedge; /取Vi的邊表頭指針while(p) /依次搜索Vi的鄰接點(diǎn)Vj(令p->adjvex=j) if(!visitedp->adjvex) /若Vj未訪問過printf("%c",G->adjlistp->adjvex.vertex); /訪問Vjv
18、isitedp->adjvex=TRUE;r=r+1; cqr=p->adjvex; /訪問過的Vj入隊(duì) p=p->next; /找Vi的下一個(gè)鄰接點(diǎn) /endwhile/=主函數(shù)=void main() int i; ALGraph *G; G=(ALGraph *)malloc(sizeof(ALGraph); CreatALGraph(G); printf("Print Graph DFS: "); DFS(G); printf("n"); printf("Print Graph BFS: "); BFS(G,
19、3); printf("n");執(zhí)行順序:Input VertexNum(n) and EdgesNum(e): 8,9Input Vertex string: 01234567V6V4V5V7V2V3V1V0Vo圖G的示例Input edges,Creat Adjacency List0 10 21 31 42 52 63 74 75 6Print Graph DFS:02651473Print Graph BFS:37140265五、 修改后的代碼1鄰接矩陣作為存儲(chǔ)結(jié)構(gòu)的程序#include"stdio.h"#include"stdlib.
20、h"#define MaxVertexNum 100 /定義最大頂點(diǎn)數(shù)typedef struct char vexsMaxVertexNum; /頂點(diǎn)表 int edgesMaxVertexNumMaxVertexNum; /鄰接矩陣,可看作邊表 int n,e; /圖中的頂點(diǎn)數(shù)n和邊數(shù)eMGraph; /用鄰接矩陣表示的圖的類型/=建立鄰接矩陣=void CreatMGraph(MGraph *G) int i,j,k; char a; printf("Input VertexNum(n) and EdgesNum(e): "); scanf("%d
21、,%d",&G->n,&G->e); /輸入頂點(diǎn)數(shù)和邊數(shù) scanf("%c",&a); printf("Input Vertex string:"); for(i=0;i<G->n;i+) scanf("%c",&a); G->vexsi=a; /讀入頂點(diǎn)信息,建立頂點(diǎn)表 for(i=0;i<G->n;i+)for(j=0;j<G->n;j+)G->edgesij=0; /初始化鄰接矩陣 printf("Input edg
22、es,Creat Adjacency Matrixn"); for(k=0;k<G->e;k+) /讀入e條邊,建立鄰接矩陣 scanf("%d%d",&i,&j); /輸入邊(Vi,Vj)的頂點(diǎn)序號(hào) G->edgesij=1; G->edgesji=1; /若為無向圖,矩陣為對(duì)稱矩陣;若建立有向圖,去掉該條語句 /=定義標(biāo)志向量,為全局變量=typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度優(yōu)先遍歷的遞歸算法=void DFSM(MGrap
23、h *G,int i) /以Vi為出發(fā)點(diǎn)對(duì)鄰接矩陣表示的圖G進(jìn)行DFS搜索,鄰接矩陣是0,1矩陣 int j; printf("%c",G->vexsi); /訪問頂點(diǎn)Vi visitedi=TRUE; /置已訪問標(biāo)志 for(j=0;j<G->n;j+) /依次搜索Vi的鄰接點(diǎn)if(G->edgesij=1 && ! visitedj) DFSM(G,j); /(Vi,Vj)E,且Vj未訪問過,故Vj為新出發(fā)點(diǎn)void DFS(MGraph *G) int i; for(i=0;i<G->n;i+)visitedi=FA
24、LSE; /標(biāo)志向量初始化 for(i=0;i<G->n;i+)if(!visitedi) /Vi未訪問過 DFSM(G,i); /以Vi為源點(diǎn)開始DFS搜索/=BFS:廣度優(yōu)先遍歷=void BFS(MGraph *G,int k) /以Vk為源點(diǎn)對(duì)用鄰接矩陣表示的圖G進(jìn)行廣度優(yōu)先搜索 int i,j,f=0,r=0; int cqMaxVertexNum; /定義隊(duì)列 for(i=0;i<G->n;i+)visitedi=FALSE; /標(biāo)志向量初始化 for(i=0;i<G->n;i+)cqi=-1; /隊(duì)列初始化 printf("%c&qu
25、ot;,G->vexsk); /訪問源點(diǎn)Vk visitedk=TRUE; cqr=k; /Vk已訪問,將其入隊(duì)。注意,實(shí)際上是將其序號(hào)入隊(duì) while(cqf!=-1) /隊(duì)非空則執(zhí)行 i=cqf; f=f+1; /Vf出隊(duì) for(j=0;j<G->n;j+) /依次Vi的鄰接點(diǎn)Vj if(G->edgesij=1 && !visitedj) /Vj未訪問 printf("%c",G->vexsj); /訪問Vj visitedj=TRUE; r=r+1; cqr=j; /訪問過Vj入隊(duì) /=main=void main()
26、 MGraph *G; G=(MGraph *)malloc(sizeof(MGraph); /為圖G申請(qǐng)內(nèi)存空間 CreatMGraph(G); /建立鄰接矩陣 printf("Print Graph DFS: "); DFS(G); /深度優(yōu)先遍歷 printf("n"); printf("Print Graph BFS: "); BFS(G,3); /以序號(hào)為3的頂點(diǎn)開始廣度優(yōu)先遍歷 printf("n");2鄰接鏈表作為存儲(chǔ)結(jié)構(gòu)程序#include"stdio.h"#include&qu
27、ot;stdlib.h"#define MaxVertexNum 50 /定義最大頂點(diǎn)數(shù)typedef struct node /邊表結(jié)點(diǎn) int adjvex; /鄰接點(diǎn)域 struct node *next; /鏈域EdgeNode;typedef struct vnode /頂點(diǎn)表結(jié)點(diǎn) char vertex; /頂點(diǎn)域 EdgeNode *firstedge; /邊表頭指針VertexNode;typedef VertexNode AdjListMaxVertexNum; /AdjList是鄰接表類型typedef struct AdjList adjlist; /鄰接表 i
28、nt n,e; /圖中當(dāng)前頂點(diǎn)數(shù)和邊數(shù) ALGraph; /圖類型/=建立圖的鄰接表=void CreatALGraph(ALGraph *G) int i,j,k; char a; EdgeNode *s; /定義邊表結(jié)點(diǎn) printf("Input VertexNum(n) and EdgesNum(e): "); scanf("%d,%d",&G->n,&G->e); /讀入頂點(diǎn)數(shù)和邊數(shù) scanf("%c",&a); printf("Input Vertex string:&quo
29、t;); for(i=0;i<G->n;i+) /建立邊表 scanf("%c",&a);G->adjlisti.vertex=a; /讀入頂點(diǎn)信息G->adjlisti.firstedge=NULL; /邊表置為空表 printf("Input edges,Creat Adjacency Listn"); for(k=0;k<G->e;k+) /建立邊表 scanf("%d%d",&i,&j); /讀入邊(Vi,Vj)的頂點(diǎn)對(duì)序號(hào)s=(EdgeNode *)malloc(s
30、izeof(EdgeNode); /生成邊表結(jié)點(diǎn)s->adjvex=j; /鄰接點(diǎn)序號(hào)為js->next=G->adjlisti.firstedge;G->adjlisti.firstedge=s; /將新結(jié)點(diǎn)*S插入頂點(diǎn)Vi的邊表頭部s=(EdgeNode *)malloc(sizeof(EdgeNode); s->adjvex=i; /鄰接點(diǎn)序號(hào)為is->next=G->adjlistj.firstedge; G->adjlistj.firstedge=s; /將新結(jié)點(diǎn)*S插入頂點(diǎn)Vj的邊表頭部 /=定義標(biāo)志向量,為全局變量=typedef
31、enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度優(yōu)先遍歷的遞歸算法=void DFSM(ALGraph *G,int i) /以Vi為出發(fā)點(diǎn)對(duì)鄰接鏈表表示的圖G進(jìn)行DFS搜索 EdgeNode *p; printf("%c",G->adjlisti.vertex); /訪問頂點(diǎn)Vi visitedi=TRUE; /標(biāo)記Vi已訪問 p=G->adjlisti.firstedge; /取Vi邊表的頭指針 while(p) /依次搜索Vi的鄰接點(diǎn)Vj,這里j=p->adjvexif(! vis
32、itedp->adjvex) /若Vj尚未被訪問 DFSM(G,p->adjvex); /則以Vj為出發(fā)點(diǎn)向縱深搜索p=p->next; /找Vi的下一個(gè)鄰接點(diǎn) void DFS(ALGraph *G) int i; for(i=0;i<G->n;i+)visitedi=FALSE; /標(biāo)志向量初始化 for(i=0;i<G->n;i+)if(!visitedi) /Vi未訪問過 DFSM(G,i); /以Vi為源點(diǎn)開始DFS搜索DFSM(G,i);/=BFS:廣度優(yōu)先遍歷=void BFS(ALGraph *G,int k) /以Vk為源點(diǎn)對(duì)用鄰接鏈表表示的圖G進(jìn)行廣度優(yōu)先搜索 int i,f=0,r=0; EdgeNode *p; int cqMaxVerte
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度石油化工設(shè)備采購合同補(bǔ)充協(xié)議范本3篇
- 二零二五年度vi設(shè)計(jì)創(chuàng)意制作合同范本2篇
- 二零二五版環(huán)境安全風(fēng)險(xiǎn)評(píng)估與治理合同3篇
- 合同管理在2025年度招投標(biāo)中的合規(guī)性分析3篇
- 二零二五版企業(yè)內(nèi)部技術(shù)人員掛靠合作合同范本3篇
- 二零二五年度高壓電氣設(shè)備采購及安裝合同2篇
- 二零二五版寶鋼集團(tuán)勞動(dòng)合同員工加班費(fèi)及休息日工作安排3篇
- 二零二五年度車輛質(zhì)押擔(dān)保合同樣本2篇
- 二零二五版公路貨運(yùn)合同道路運(yùn)輸許可證管理與審查規(guī)范3篇
- 二零二五年度綠色環(huán)保房地產(chǎn)商品房買賣合同書3篇
- 10日益重要的國際組織第三課時(shí)中國與國際組織(教學(xué)設(shè)計(jì))2023-2024學(xué)年統(tǒng)編版道德與法治六年級(jí)下冊(cè)
- Unit 1 同步練習(xí)人教版2024七年級(jí)英語上冊(cè)
- 工程管理重大風(fēng)險(xiǎn)應(yīng)對(duì)方案
- 直播帶貨助農(nóng)現(xiàn)狀及發(fā)展對(duì)策研究-以抖音直播為例(開題)
- 腰椎間盤突出疑難病例討論
- 《光伏發(fā)電工程工程量清單計(jì)價(jià)規(guī)范》
- 2023-2024學(xué)年度人教版四年級(jí)語文上冊(cè)寒假作業(yè)
- (完整版)保證藥品信息來源合法、真實(shí)、安全的管理措施、情況說明及相關(guān)證明
- 營銷專員績效考核指標(biāo)
- 陜西麟游風(fēng)電吊裝方案專家論證版
- 供應(yīng)商審核培訓(xùn)教程
評(píng)論
0/150
提交評(píng)論