版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、實驗五 圖的表示與遍歷一、實驗?zāi)康?、掌握圖的鄰接矩陣和鄰接表表示2、掌握圖的深度優(yōu)先和廣度優(yōu)先搜索方法 3、理解圖的應(yīng)用方法二、實驗預(yù)習(xí)說明以下概念1、深度優(yōu)先搜索遍歷:從根開始一個一個搜索2、廣度優(yōu)先搜索遍歷:從根的鄰接點出發(fā)依次訪問3、拓?fù)渑判颍?一個無指向的點開始排序4、最小生成樹: 最小權(quán)的生成樹5、最短路徑: 路徑權(quán)數(shù)最小三、實驗內(nèi)容和要求1、閱讀并運行下面程序,根據(jù)輸入寫出運行結(jié)果。#include<stdio.h>#define N 20#define TRUE 1#define FALSE 0int visitedN; typedef struct /*隊列的定義
2、*/ int dataN; int front,rear;queue;typedef struct /*圖的鄰接矩陣*/ int vexnum,arcnum; char vexsN; int arcsNN;graph;void createGraph(graph *g); /*建立一個無向圖的鄰接矩陣*/void dfs(int i,graph *g); /*從第i個頂點出發(fā)深度優(yōu)先搜索*/void tdfs(graph *g); /*深度優(yōu)先搜索整個圖*/void bfs(int k,graph *g); /*從第k個頂點廣度優(yōu)先搜索*/void tbfs(graph *g); /*廣度優(yōu)先
3、搜索整個圖*/void init_visit(); /*初始化訪問標(biāo)識數(shù)組*/void createGraph(graph *g) /*建立一個無向圖的鄰接矩陣*/ int i,j; char v; g->vexnum=0; g->arcnum=0; i=0; printf("輸入頂點序列(以#結(jié)束):n"); while(v=getchar()!='#') g->vexsi=v; /*讀入頂點信息*/ i+; g->vexnum=i; /*頂點數(shù)目*/ for(i=0;i<g->vexnum;i+) /*鄰接矩陣初始化*
4、/ for(j=0;j<g->vexnum;j+) g->arcsij=0; printf("輸入邊的信息:n"); scanf("%d,%d",&i,&j); /*讀入邊i,j*/ while(i!=-1) /*讀入i,j為1時結(jié)束*/ g->arcsij=1; g->arcsji=1; scanf("%d,%d",&i,&j); void dfs(int i,graph *g) /*從第i個頂點出發(fā)深度優(yōu)先搜索*/ int j; printf("%c"
5、;,g->vexsi); visitedi=TRUE; for(j=0;j<g->vexnum;j+) if(g->arcsij=1)&&(!visitedj) dfs(j,g);void tdfs(graph *g) /*深度優(yōu)先搜索整個圖*/ int i; printf("n從頂點%C開始深度優(yōu)先搜索序列:",g->vexs0); for(i=0;i<g->vexnum;i+) if(visitedi!=TRUE) dfs(i,g);void bfs(int k,graph *g) /*從第k個頂點廣度優(yōu)先搜索*
6、/ int i,j; queue qlist,*q; q=&qlist; q->rear=0; q->front=0; printf("%c",g->vexsk); visitedk=TRUE; q->dataq->rear=k; q->rear=(q->rear+1)%N; while(q->rear!=q->front) i=q->dataq->front; q->front=(q->front+1)%N; for(j=0;j<g->vexnum;j+) if(g->
7、arcsij=1)&&(!visitedj) printf("%c",g->vexsj); visitedj=TRUE; q->dataq->rear=j; q->rear=(q->rear+1)%N; void tbfs(graph *g) /*廣度優(yōu)先搜索整個圖*/ int i; printf("n從頂點%C開始廣度優(yōu)先搜索序列:",g->vexs0); for(i=0;i<g->vexnum;i+) if(visitedi!=TRUE) bfs(i,g);void init_visit
8、() /*初始化訪問標(biāo)識數(shù)組*/ int i; for(i=0;i<N;i+) visitedi=FALSE;int main() graph ga; int i,j; createGraph(&ga); printf("無向圖的鄰接矩陣:n");for(i=0;i<ga.vexnum;i+) for(j=0;j<ga.vexnum;j+) printf("%3d",ga.arcsij); printf("n"); init_visit(); tdfs(&ga); init_visit(); tbfs
9、(&ga); return 0;§ 根據(jù)右圖的結(jié)構(gòu)驗證實驗,輸入:ABCDEFGH#ABCDEFGH012345670,10,20,51,31,42,52,63,74,7-1,-1§ 運行結(jié)果:2、閱讀并運行下面程序,補充拓?fù)渑判蛩惴ā?include<stdio.h>#include<malloc.h>#define N 20typedef struct edgenode /*圖的鄰接表:鄰接鏈表結(jié)點*/ int adjvex; /*頂點序號*/ struct edgenode *next; /*下一個結(jié)點的指針*/edgenode;typ
10、edef struct vnode /*圖的鄰接表:鄰接表*/ char data; /*頂點信息*/ int ind; /*頂點入度*/ struct edgenode *link; /*指向鄰接鏈表指針*/vnode;void createGraph_list(vnode adjlist,int *p); /*建立有向圖的鄰接表*/void topSort(vnode g,int n); /*拓?fù)渑判?/void createGraph_list(vnode adjlist,int *p) /*建立有向圖的鄰接表*/ int i,j,n,e; char v; edgenode *s; i=
11、0;n=0;e=0; printf("輸入頂點序列(以#結(jié)束):n"); while(v=getchar()!='#') adjlisti.data=v; /*讀入頂點信息*/ adjlisti.link=NULL; adjlisti.ind=0; i+; n=i; *p=n; /*建立鄰接鏈表*/ printf("n請輸入弧的信息(i=-1結(jié)束):i,j:n"); scanf("%d,%d",&i,&j); while(i!=-1) s=(struct edgenode*)malloc(sizeof(
12、edgenode); s->adjvex=j; s->next=adjlisti.link; adjlisti.link=s; adjlistj.ind+; /*頂點j的入度加1*/ e+; scanf("%d,%d",&i,&j); printf("鄰接表:"); for(i=0;i<n;i+) /*輸出鄰接表*/ printf("n%c,%d:",adjlisti.data,adjlisti.ind); s=adjlisti.link; while(s!=NULL) printf("-&
13、gt;%d",s->adjvex); s=s->next; void topSort(vnode g,int n) /*拓?fù)渑判?/int main() vnode adjlistN; int n,*p; p=&n; createGraph_list(adjlist,p); return 0;§ 根據(jù)輸入,輸出有向圖的拓?fù)渑判蛐蛄?。并畫出有向圖。輸入:ABCDEF#0,11,22,34,14,5-1,-1§ 運行結(jié)果:3、閱讀并運行下面程序。#include<stdio.h>#define N 20#define TRUE 1#de
14、fine INF 32766 /*鄰接矩陣中的無窮大元素*/#define INFIN 32767 /*比無窮大元素大的數(shù)*/typedef struct /*圖的鄰接矩陣*/ int vexnum,arcnum; char vexsN; int arcsNN;graph;void createGraph_w(graph *g,int flag);void prim(graph *g,int u);void dijkstra(graph g,int v);void showprim();void showdij();/*建帶權(quán)圖的鄰接矩陣,若flag為1則為無向圖,flag為0為有向圖*/vo
15、id createGraph_w(graph *g,int flag) int i,j,w; char v; g->vexnum=0; g->arcnum=0; i=0; printf("輸入頂點序列(以#結(jié)束):n"); while(v=getchar()!='#') g->vexsi=v; /*讀入頂點信息*/ i+; g->vexnum=i; for(i=0;i<6;i+) /*鄰接矩陣初始化*/ for(j=0;j<6;j+) g->arcsij=INF; printf("輸入邊的信息:n"
16、;); scanf("%d,%d,%d",&i,&j,&w); /*讀入邊(i,j,w)*/ while(i!=-1) /*讀入i為1時結(jié)束*/ g->arcsij=w; if(flag=1) g->arcsji=w; scanf("%d,%d,%d",&i,&j,&w); void prim(graph *g,int u)/*出發(fā)頂點u*/ int lowcostN,closestN,i,j,k,min; for(i=0;i<g->vexnum;i+) /*求其他頂點到出發(fā)頂點u的
17、權(quán)*/ lowcosti=g->arcsui; closesti=u; lowcostu=0; for(i=1;i<g->vexnum;i+) /*循環(huán)求最小生成樹中的各條邊*/ min=INFIN; for(j=0;j<g->vexnum;j+) /*選擇得到一條代價最小的邊*/ if(lowcostj!=0&&lowcostj<min) min=lowcostj; k=j; printf("(%c,%c)-%dn",g->vexsclosestk,g->vexsk,lowcostk); /*輸出該邊*/ l
18、owcostk=0; /*頂點k納入最小生成樹 */ for(j=0;j<g->vexnum;j+) /*求其他頂點到頂點k 的權(quán)*/ if(g->arcskj!=0&&g->arcskj<lowcostj) lowcostj=g->arcskj; closestj=k; void printPath(graph g,int startVex,int EndVex) int stackN,top=0; /*堆棧*/ int i,k,j; int flagN; /*輸出路徑頂點標(biāo)志*/ k=EndVex; for (i=0;i<g.vex
19、num;i+) flagi=0; j=startVex; printf("%c",g.vexsj); flagj=1; stacktop+=k; while (top>0) /*找j到k的路徑*/ for (i=0;i<g.vexnum;i+) if (pathki=1 && flagi=0) /*j到k的路徑含有i頂點*/ if (g.arcsji!=INF ) /*j到i的路徑含有中間頂點*/ printf("-> %c(%d) ",g.vexsi,g.arcsji); /*輸出j到k的路徑的頂點i*/ flagi=
20、1; j=i; k=stack-top; break; else if (i!=k) stacktop+=i; /*break;*/ void dijkstra(graph g,int v) /*dijkstra算法求單源最短路徑*/ int pathNN,distN,sN; int mindis,i,j,u,k; for(i=0;i<g.vexnum;i+) disti=g.arcsvi; si=0; for(j=0;j<g.vexnum;j+) pathij=0; if(disti<INF) pathiv=1; pathii=1; distv=0; sv=1; for(i
21、=0,u=1;i<g.vexnum;i+) mindis=INFIN; for(j=0;j<g.vexnum;j+) if(sj=0) if(distj<mindis) u=j; mindis=distj; su=1; for(j=0;j<g.vexnum;j+) if(sj=0)&&distu+g.arcsuj<distj) distj=distu+g.arcsuj; for(k=0;k<g.vexnum;k+) pathjk=pathuk; pathjj=1; printf("n頂點%c->到各頂點的最短路徑n",g.vexsv); for(i=0;i<g.vexnum;i+) printf("n頂點%
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車聯(lián)網(wǎng)技術(shù)在網(wǎng)絡(luò)預(yù)約出租汽車行業(yè)的創(chuàng)新與發(fā)展
- 二零二五年度住宅小區(qū)車位租賃及維修保養(yǎng)服務(wù)協(xié)議3篇
- 二零二五年度商業(yè)空間地板磚供應(yīng)與安裝服務(wù)合同2篇
- 二零二五年度信息技術(shù)企業(yè)員工聘用合同樣本
- 二零二五年度全新知識產(chǎn)權(quán)轉(zhuǎn)讓居間介紹費合同下載2篇
- 2025年度文化廣場場地管理及文化活動組織合同4篇
- 二零二五年度租賃車輛廣告合作合同品牌植入4篇
- 2025年度留學(xué)國際學(xué)生資助計劃服務(wù)合同4篇
- 2025年度大米加工廢棄物處理合作協(xié)議4篇
- 貴州航天醫(yī)院2025年度保安服務(wù)外包與交通指揮合同3篇
- 納米復(fù)合材料增強金屬基材
- 拆除豬場補償協(xié)議書模板
- 水利水電工程施工安全管理導(dǎo)則
- 5歲幼兒數(shù)學(xué)練習(xí)題
- 2024年高中生物新教材同步選擇性必修第三冊學(xué)習(xí)筆記第3章 本章知識網(wǎng)絡(luò)
- 2024年全國體育單招英語考卷和答案
- 食品安全管理制度可打印【7】
- 藥物流行病學(xué)教學(xué)大綱
- 健康管理師二級理論考核試題及答案
- 手術(shù)室常見消毒滅菌方法
- 2024年九年級語文中考名著閱讀《儒林外史》考前練附答案
評論
0/150
提交評論