收藏 分享(赏)

实验7 图的表示与遍历.doc

上传人:精品资料 文档编号:10586485 上传时间:2019-12-02 格式:DOC 页数:14 大小:297.13KB
下载 相关 举报
实验7 图的表示与遍历.doc_第1页
第1页 / 共14页
实验7 图的表示与遍历.doc_第2页
第2页 / 共14页
实验7 图的表示与遍历.doc_第3页
第3页 / 共14页
实验7 图的表示与遍历.doc_第4页
第4页 / 共14页
实验7 图的表示与遍历.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、1实验五 图的表示与遍历一、实验目的1、掌握图的邻接矩阵和邻接表表示2、掌握图的深度优先和广度优先搜索方法 3、理解图的应用方法二、实验预习说明以下概念1、深度优先搜索遍历:从根开始一个一个搜索2、广度优先搜索遍历:从根的邻接点出发依次访问3、拓扑排序:一个无指向的点开始排序4、最小生成树:最小权的生成树5、最短路径:路径权数最小三、实验内容和要求1、阅读并运行下面程序,根据输入写出运行结果。#include#define N 20#define TRUE 1#define FALSE 0int visitedN; typedef struct /*队列的定义 */int dataN;int

2、front,rear;queue;typedef struct /*图的邻接矩阵 */int vexnum,arcnum;char vexsN;int arcsNN;graph;void createGraph(graph *g); /*建立一个无向图的邻接矩阵*/void dfs(int i,graph *g); /*从第 i 个顶点出发深度优先搜索 */2void tdfs(graph *g); /*深度优先搜索整个图*/void bfs(int k,graph *g); /*从第 k 个顶点广度优先搜索 */void tbfs(graph *g); /*广度优先搜索整个图*/void i

3、nit_visit(); /*初始化访问标识数组 */void createGraph(graph *g) /*建立一个无向图的邻接矩阵 */ int i,j;char v;g-vexnum=0;g-arcnum=0;i=0;printf(“输入顶点序列 (以#结束) :n“);while(v=getchar()!=#)g-vexsi=v; /*读入顶点信息*/i+;g-vexnum=i; /*顶点数目*/for(i=0;ivexnum;i+) /*邻接矩阵初始化*/for(j=0;jvexnum;j+)g-arcsij=0;printf(“输入边的信息 :n“);scanf(“%d,%d“,

4、 /*读入边 i,j*/while(i!=-1) /*读入 i,j 为1 时结束*/g-arcsij=1;g-arcsji=1;scanf(“%d,%d“,void dfs(int i,graph *g) /*从第 i 个顶点出发深度优先搜索 */int j;printf(“%c“,g-vexsi);visitedi=TRUE;for(j=0;jvexnum;j+)if(g-arcsij=1)void tdfs(graph *g) /*深度优先搜索整个图 */int i;3printf(“n 从顶点%C 开始深度优先搜索序列:“,g-vexs0);for(i=0;ivexnum;i+)if(v

5、isitedi!=TRUE)dfs(i,g);void bfs(int k,graph *g) /*从第 k 个顶点广度优先搜索*/int i,j;queue qlist,*q;q=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;jvexnum;j+)if(g-arcsij=1)visitedj=TRUE;q-dataq-rear=

6、j;q-rear=(q-rear+1)%N;void tbfs(graph *g) /*广度优先搜索整个图*/int i;printf(“n 从顶点%C 开始广度优先搜索序列:“,g-vexs0);for(i=0;ivexnum;i+)if(visitedi!=TRUE)bfs(i,g);void init_visit() /*初始化访问标识数组*/int i;4for(i=0;i#include#define N 20typedef struct edgenode /*图的邻接表:邻接链表结点*/int adjvex; /*顶点序号*/struct edgenode *next; /*下一个

7、结点的指针*/edgenode;typedef struct vnode /*图的邻接表:邻接表*/char data; /*顶点信息*/int ind; /*顶点入度 */struct edgenode *link; /*指向邻接链表指针*/vnode;void createGraph_list(vnode adjlist,int *p); /*建立有向图的邻接表*/void topSort(vnode g,int n); /*拓扑排序*/void createGraph_list(vnode adjlist,int *p) /*建立有向图的邻接表*/6int i,j,n,e;char v;

8、edgenode *s;i=0;n=0;e=0;printf(“输入顶点序列 (以#结束) :n“);while(v=getchar()!=#)adjlisti.data=v; /*读入顶点信息 */adjlisti.link=NULL;adjlisti.ind=0;i+;n=i;*p=n;/*建立邻接链表 */printf(“n 请输入弧的信息 (i=-1 结束):i,j:n“);scanf(“%d,%d“,while(i!=-1)s=(struct edgenode*)malloc(sizeof(edgenode);s-adjvex=j;s-next=adjlisti.link;adjli

9、sti.link=s;adjlistj.ind+; /*顶点 j 的入度加 1*/e+;scanf(“%d,%d“,printf(“邻接表:“);for(i=0;i%d“,s-adjvex);s=s-next;void topSort(vnode g,int n) /*拓扑排序*/7int main()vnode adjlistN;int n,*p;p=createGraph_list(adjlist,p);return 0; 根据输入,输出有向图的拓扑排序序列。并画出有向图。输入:ABCDEF#0,11,22,34,14,5-1,-1 运行结果:83、阅读并运行下面程序。#include#d

10、efine N 20#define TRUE 1#define INF 32766 /*邻接矩阵中的无穷大元素*/#define INFIN 32767 /*比无穷大元素大的数 */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();/*建带权图的邻接矩阵,若

11、flag 为 1 则为无向图,flag 为 0 为有向图*/void createGraph_w(graph *g,int flag)int i,j,w;char v;g-vexnum=0;g-arcnum=0;i=0;printf(“输入顶点序列 (以#结束) :n“);while(v=getchar()!=#)g-vexsi=v; /*读入顶点信息*/i+;g-vexnum=i;for(i=0;iarcsij=INF;printf(“输入边的信息 :n“);scanf(“%d,%d,%d“, /*读入边(i,j,w)*/while(i!=-1) /*读入 i 为1 时结束 */g-arcs

12、ij=w;9if(flag=1)g-arcsji=w;scanf(“%d,%d,%d“,void prim(graph *g,int u)/*出发顶点 u*/int lowcostN,closestN,i,j,k,min;for(i=0;ivexnum;i+) /*求其他顶点到出发顶点 u 的权*/lowcosti=g-arcsui;closesti=u;lowcostu=0;for(i=1;ivexnum;i+) /*循环求最小生成树中的各条边*/ min=INFIN;for(j=0;jvexnum;j+) /*选择得到一条代价最小的边*/if(lowcostj!=0 /*输出该边*/low

13、costk=0; /*顶点 k 纳入最小生成树 */for(j=0;jvexnum;j+) /*求其他顶点到顶点 k 的权*/if(g-arcskj!=0closestj=k;void printPath(graph g,int startVex,int EndVex)int stackN,top=0; /*堆栈*/int i,k,j;int flagN; /*输出路径顶点标志 */k=EndVex;for (i=0;i0) /*找 j 到 k 的路径*/for (i=0;i %c(%d) “,g.vexsi,g.arcsji); /*输出 j 到 k 的路径的顶点 i*/flagi=1;j=

14、i;k=stack-top;break;elseif (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到各顶点的最短路径n“,g.vexsv);for(i=0;i顶点%c :“,g.vexsv,g.vexsi);if(disti=INF|disti=0)printf(“无路径 “);elseprintf(“%d “,disti);printf(“经过顶点: “);printPath(g,

15、v,i); /*输出 v 到 i 的路径 */void showprim()/*最小生成树 prim 算法演示*/graph ga;createGraph_w(prim(void showdij() /*dijstra 算法演示*/graph ga;createGraph_w(dijkstra(ga,0);int main()showprim(); /*prim 算法演示*/getchar();showdij(); /*dijstra 算法演示*/return 0;12 下面的输入分别验证 prim 算法和 dijstra 算法。输入实例的第一部分为无向图,求其最小生成树;输入的第二部分为有向图,求其最短路径。最小生成树 最短路径ABCDEF#0,1,60,2,10,3,51,2,51,4,32,3,52,4,62,5,43,5,24,5,6-1,-1,-1ABCDEF#0,2,100,5,1000,4,301,2,52,3,503,4,203,5,104,3,204,5,60-1,-1,-1 运行结果:(并画出两个图)最小生成树 最短路径13四、实验小结图的表示和变厉需要很强的逻辑性 五、教师评语14

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报