数据结构第七章课后习题答案.doc_第1页
数据结构第七章课后习题答案.doc_第2页
数据结构第七章课后习题答案.doc_第3页
数据结构第七章课后习题答案.doc_第4页
数据结构第七章课后习题答案.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

7_1对于图题7.1(P235)的无向图,给出:(1) 表示该图的邻接矩阵。(2) 表示该图的邻接表。(3) 图中每个顶点的度。解:(1) 邻接矩阵: 0111000 1001100 1001010 1110111 0101001 0011001 0001110(2) 邻接表: 1:2-3-4-NULL;2: 1-4-5-NULL;3: 1-4-6-NULL;4: 1-2-3-5-6-7-NULL;5: 2-4-7-NULL;6: 3-4-7-NULL;7: 4-5-6-NULL;(3) 图中每个顶点的度分别为:3,3,3,6,3,3,3。 7_2 对于图题7.1的无向图,给出:(1)从顶点1出发,按深度优先搜索法遍历图时所得到的顶点序(2)从顶点1出发,按广度优先法搜索法遍历图时所得到的顶点序列。(1)DFS法:存储结构: 本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点形式由类型L_NODE规定,而各个链表的头指针存放在数组head中。数组e中的元素e0,e1,.,em-1给出图中的m条边,e中结点形式由类型E_NODE规定。visiti数组用来表示顶点i是否被访问过。遍历前置visit各元素为0,若顶点i被访问过,则置visiti为1.算法分析: 首先访问出发顶点v.接着,选择一个与v相邻接且未被访问过的的顶点w访问之,再从w开始进行深度优先搜索。每当到达一个其所有相邻接的顶点都被访问过的顶点,就从最后访问的顶点开始,依次退回到尚有邻接顶点未曾访问过的顶点u,并从u开始进行深度优先搜索。这个过程进行到所有顶点都被访问过,或从任何一个已访问过的顶点出发,再也无法到达未曾访问过的顶点,则搜索过程就结束。 另一方面,先建立一个相应的具有n个顶点,m条边的无向图的邻接表。初始化visit数组,使其各个元素置为0,表示图中每个顶点都没被访问过。下面给出程序: #include#define MAXN 50#define MAXM 100typedef struct l_nodeint ver; struct l_node *link; L_NODE;typedef struct e_nodeint ver1; int ver2; E_NODE;void creat_adj_list(L_NODE *head,int n,E_NODE e,int m)int i,u,v; L_NODE *p,*q; for(i=1;i=n;i+) headi=NULL; for(i=0;iver=v; p-link=NULL; if(headu=NULL) headu=p; else q=headu; while(q-link!=NULL) q=q-link; q-link=p; p=(L_NODE*)malloc(sizeof(L_NODE); p-ver=u; p-link=NULL; if(headv=NULL) headv=p; else q=headv; while(q-link!=NULL) q=q-link; q-link=p; void init(int visit,int n)int i; for(i=1;iver=0) dfs(t-ver,head,visit); t=t-link;测试报告:void main()L_NODE *headMAXN;int visitMAXN,n,m,u;E_NODE e12;e0.ver1=1;e0.ver2=3;e1.ver1=1;e1.ver2=4;e2.ver1=1;e2.ver2=2;e3.ver1=2;e3.ver2=4;e4.ver1=2;e4.ver2=5;e5.ver1=3;e5.ver2=6;e6.ver1=3;e6.ver2=4;e7.ver1=4;e7.ver2=6;e8.ver1=4;e8.ver2=7;e9.ver1=4;e9.ver2=5;e10.ver1=5;e10.ver2=7;e11.ver1=6;e11.ver2=7;creat_adj_list(head,7,e,12);init(visit,7);dfs(head,visit,1);printf(n);输出结果:1 3 6 4 2 5 7(1) BFS法:存储结构: 本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点形式由类型L_NODE规定,而各个链表的头指针存放在数组head中。数组e中的元素e0,e1,.,em-1给出图中的m条边,e中结点形式由类型E_NODE规定。visiti数组用来表示顶点i是否被访问过。遍历前置visit各元素为0,若顶点i被访问过,则置visiti为1.另外,使用一个队列QTYPE来存储已经访问过的顶点。算发分析: 首先访问出发顶点v,然后访问与顶点v邻接的全部顶点w1,w2,wi,再依次访问与w1,w2,wi,邻接的全部顶点(已访问的顶点除外),再从这些已访问的顶点出发,依次与它们邻接的全部顶点(已访问的顶点除外)。依次类推,直到图中或v所在的连通分量的所有顶点都被访问到为止,广度优先搜索结束。下面给出程序:#include#define MAXN 50#define MAXM 100typedef struct l_nodeint ver; struct l_node *link;L_NODE;typedef struct e_nodeint ver1; int ver2;E_NODE;void creat_adj_list(L_NODE *head,int n,E_NODE e,int m)int i,u,v; L_NODE *p,*q; for(i=1;i=n;i+) headi=NULL; for(i=0;iver=v; p-link=NULL; if(headu=NULL) headu=p; else q=headu; while(q-link!=NULL) q=q-link; q-link=p; p=(L_NODE*)malloc(sizeof(L_NODE); p-ver=u; p-link=NULL; if(headv=NULL) headv=p; else q=headv; while(q-link!=NULL) q=q-link; q-link=p; void init(int visit,int n)int i; for(i=1;i=n;i+) visiti=0;void bfs(int u,L_NODE *head,int visit)typedef struct queuetypeint qa; int qe; int itemMAXN; QTYPE;int v,w;L_NODE *t;QTYPE queue;printf(%4d,u);visitu=1;queue.qa=0;queue.qe=0;queue.item0=u;while(queue.qaver; if(visitw=0) printf(%4d,w); visitw=1; queue.item+queue.qe=w; t=t-link; 测试报告:void main()L_NODE *headMAXN;int visitMAXN,n,m,u;E_NODE e12;e0.ver1=1;e0.ver2=3;e1.ver1=1;e1.ver2=4;e2.ver1=1;e2.ver2=2;e3.ver1=2;e3.ver2=4;e4.ver1=2;e4.ver2=5;e5.ver1=3;e5.ver2=6;e6.ver1=3;e6.ver2=4;e7.ver1=4;e7.ver2=6;e8.ver1=4;e8.ver2=7;e9.ver1=4;e9.ver2=5;e10.ver1=5;e10.ver2=7;e11.ver1=6;e11.ver2=7;creat_adj_list(head,7,e,12);init(visit,7);bfs(1,head,visit);printf(n);输出结果:1342675 67351247_3 对于图题7.3的有向图,给出:(1) 表示该图的邻接矩阵。(2) 表示该图的邻接表。(3) 图中每个顶点的入度和出度。 解:(1) 邻接矩阵如下: 0 1 0 1 0 0 0 图题7.3 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0(2) 邻接表如下: 5157366241234567(4) 设各顶点入度和出度分别为ri,ci:r1=1,c1=2r2=1,c2=1r3=1,c3=1r4=1,c4=2r5=2,c5=1r6=2,c6=1r7=1,c7=17_4对于图题7.3的有向图,给出:(1) 从顶点1出发,按深度优先搜索法遍历图时的所得的顶点序列。(2) 从顶点1出发,按广度优先搜索法遍历图时的所得的定点序列。解:(1) 1257634(2) 12456737_5 对于图题7.1的无向图,试问它是(1)连通图吗?(2)完全图吗?1 2 3 4 5 6 7(1) 该图是连通图。判断无向图是否为连通图,即判断该图中是否每对顶点之间都有路径。(2) 该图不是完全图。判断无向图是否为完全图,即判断图中是否每对顶点之间都有边。7_6 对于图题 7.3的有向图,试问它是(1)弱连通图吗?(2)强连通图吗?1 2 3 4 5 6 7(1) 该图是弱连通图。判断有向图是否为弱连通图,即需判断图中是否每对顶点v和w之间有一个由不同顶点组成的顶点序列(v0,v1,vk),其中v0=v,vk=w,且(vi,vi+1)或(vi+1,vi)属于图的边集。(2) 该图是强连通图。判断有向图是否为强连通图,即需判断图中是否每对顶点之间有一条路径。7_7图题7-7是有向图,试问其中哪个图是(1) 弱连通的?(2) 强连通的?43211243 (a) (b)解(1)(b) 图是弱连通的。 (2)( a) 图是强连通的。7_8具有N个顶点的连通无向图至少有几条边?解具有N个顶点的连通无向图至少应有N1条边。7_9具有N个顶点的强连通有向图至少有几条边? 2N条边。7_10分别写出用深度和广度优先搜索法遍历具有六个顶点的完全无向图的顶点序列。(假设都以顶点1出发)。深度优先:1,2,3,4,5,6广度优先:1,2,3,4,5,67_11题目:改写以深度优先搜索法遍历给定的连通图的dfs程序,要求不用递归方法,而用一个栈来实现。算法分析:用栈保存由结点V出发可到达的结点,并作上标记,以使下次遇到时不会重复输出。当一路结点访问完后,向前回溯(利用出栈)并访问其他结点,直到所有结点均已遍历。程序的流程:结点进栈结点出栈访问并标记结点相联结点进栈。(相联结点进栈后,执行相同的步骤)当栈空时,遍历完成。程序:#define MAXN 50typedef struct nodeint data;struct node* link;void dfs(NODE *head,int ver,int v) int sMAXN,visitMAXN; int top,i; for(i=1;i=0)v=stop-;if(visitv=0)printf(%dt,v);visitv=1;for(p=headv;p;p=p-link)if(visitp-data=0)s+top=p-data; printf(n);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论