77范文网 - 专业文章范例文档资料分享平台

《第7章 图结构》习题解答(2)

来源:网络收集 时间:2019-03-03 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

第7章 图结构

设G=(V,VR)是一个图,含有n个顶点,那么G的邻接矩阵是表示G中顶点之间相邻关系的n阶方阵An×n,下面分别根据有权图和无权图给出矩阵A的定义。

如果G是无权图,则A的定义为:

?1A[i][j]???0如果G是有权图,则A的定义为:

(vi,vj)?VR或?vi,vj??VR其它情况

A[i][j]???wij?0(vi,vj)?VR或?vi,vj??V(权值wij?0)R

其它情况(为操作统一此处用0而非?)【例7.1】分别给出图7.1、图7.3中各图的邻接矩阵。

在图7.1(a)、图7.1(b)中,图的顶点顺序按v1,v2,v3,v4,v5,v6排列时的邻接矩阵分别如图7.9(a)、图7.9(b)所示;在图7.3(a)、图7.3(b)中,图的顶点顺序分别按A,B,C,D和A,B,C,D,E排列时的邻接矩阵分别如图7.9(c)、图7.9(d)所示。

显然,图的邻接矩阵有以下特点:

(1) 当图中顶点的排列顺序确定后,该图的邻接矩阵是唯一确定的;

(2) 无向图的邻接矩阵是对称的,可以采用压缩存储的方法仅存入其下三角(或上三角)部分的元素即可;

(3) 在无向图中,顶点vi的度是其邻接矩阵A的第i行元素的和,即:TD(vi)??A[i][j];

j?0n?1(4) 在有向图中,顶点vi的出度是其邻接矩阵A的第i行元素的和,而入度是A的第i列元素的和,所以vi 的度可以表示为:TD(vi)??A[i][j]??A[j][i](n为图中顶点的个数)。

j?0j?0n?1n?12.邻接矩阵的存储表示与实现 (1)邻接矩阵的类型定义

typedef enum{DG,DN,UDG,UDN}GKind; //图的类型GKind{有向图,有向网,无向图,无向网}

-.172.-

第7章 图结构

typedef int VType; //为便于操作,定义顶点类型VType为int 型 struct VNode{int flag;VType vex;}; //顶点与访问情况类型VNode{访问次数,顶点信息} struct MGraph{ //定义图的邻接矩阵类型MGraph VNode* vexs; //描述顶点的数组指针vexs VType* arcs; //邻接矩阵的数组指针arcs int vexnum,arcnum; //顶点数vexnum和边或弧数arcnum GKind kind; //图的种类标志kind };

(2)查找图中顶点位置的操作

函数的功能是,返回顶点u在图G中的位置,查找失败返回0值。 int LocateVex_MG(MGraph G,VType u) { int i; for(i=0;i

(3)邻接矩阵的建立操作

函数的功能是,根据图G的种类标志kind建立图G的所有信息。 #include\

void CreateGraph_MG(MGraph& G,GKind kind) { int i,j,k; VType u,v; cout<<\输入顶点数vexnum和弧数arcnum:\ cin>>G.vexnum>>G.arcnum; G.kind=kind; G.vexs=new VNode[G.vexnum]; //为G.vexs分配存储空间 G.arcs=new VType[G.vexnum*G.vexnum]; //为G.arcs分配存储空间 cout<<\按某种顺序输入\.vexnum<<\个顶点的值:\\n\ for(i=0;i>G.vexs[i].vex; //输入所有顶点的信息到G.vexs中 } for(i=0;i

-.173.-

第7章 图结构

}

else cout<<\输入图中\.arcnum<<\条边(弧)和权的信息u v w:\\n\

for(k=0;k>u>>v; } //根据顶点信息找到所在位置 while(!((i=LocateVex_MG(G,u))&&(j=LocateVex_MG(G,v)))); i--,j--; //i,j从位置值转换为下标值 G.arcs[i*G.vexnum+j]=1; if(G.kind==DN||G.kind==UDN) cin>>G.arcs[i*G.vexnum+j]; //输入相应边或弧的权重w if(G.kind==UDG||G.kind==UDN) //无向图的邻接矩阵是对称的 G.arcs[j*G.vexnum+i]=G.arcs[i*G.vexnum+j]; }

(4)显示输出邻接矩阵的操作

函数功能是,显示输出图G的邻接矩阵G.arcs。 void DisplyMG(MGraph G) { int i,j; for(i=0;i

(5)演示程序主函数

程序中分别建立有向图G1、无向图G2、有向网G3和无向网G4的邻接矩阵,并显示输出每个邻接矩阵的数据信息。

void main()

{ MGraph G1,G2,G3,G4; GKind gk1=DG,gk2=UDG,gk3=DN,gk4=UDN; cout<<\建立一个有向图的邻接矩阵G1:\\n\ CreateGraph_MG(G1,gk1); cout<<\建立一个无向图的邻接矩阵G2:\\n\ CreateGraph_MG(G2,gk2); cout<<\有向图G1的邻接矩阵为:\\n\ DisplyMG(G1); cout<<\无向图G2的邻接矩阵为:\\n\ DisplyMG(G2); cout<<\ cout<<\建立一个有向网的邻接矩阵G3:\\n\

-.174.-

第7章 图结构

CreateGraph_MG(G3,gk3); cout<<\建立一个无向网的邻接矩阵G4:\\n\ CreateGraph_MG(G4,gk4); cout<<\有向网G3的邻接矩阵为:\\n\ DisplyMG(G3); cout<<\无向网G4的邻接矩阵为:\\n\ DisplyMG(G4);

}程序运行演示结果为:

建立一个有向图的邻接矩阵G1:

输入顶点数vexnum和弧数arcnum:6 8↙ 按某种顺序输入6个顶点的值: 1 2 3 4 5 6↙

输入图中8条边(弧)的信息u v:

1 2 1 4 3 1 3 6 4 3 5 4 6 1 6 5↙ 建立一个无向图的邻接矩阵G2:

输入顶点数vexnum和弧数arcnum:6 7↙ 按某种顺序输入6个顶点的值: 1 2 3 4 5 6↙

输入图中7条边(弧)的信息u v:

1 2 1 4 2 3 2 6 5 3 5 6 5 4↙ 有向图G1的邻接矩阵为: 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0

无向图G2的邻接矩阵为: 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 1

0 1 0 0 1 0

*************************************** 建立一个有向网的邻接矩阵G3:

输入顶点数vexnum和弧数arcnum:4 4↙ 按某种顺序输入4个顶点的值: 1 2 3 4↙

输入图中4条边(弧)和权的信息u v w: 1 2 7 1 3 1 3 4 5 4 1 9↙ 建立一个无向网的邻接矩阵G4:

输入顶点数vexnum和弧数arcnum:5 5↙ 按某种顺序输入5个顶点的值: 1 2 3 4 5↙

输入图中5条边(弧)和权的信息u v w: 1 2 9 4 1 8 4 2 3 4 5 1 3 5 12↙ 有向网G3的邻接矩阵为: 0 7 1 0 0 0 0 0 0 0 0 5 9 0 0 0

无向网G4的邻接矩阵为: 0 9 0 8 0 9 0 0 3 0 0 0 0 0 12 8 3 0 0 1 0 0 12 1 0

说明:

(1)程序演示中建立的是图7.1、图7.3中4个图的邻接矩阵:G1.arcs、G2.arcs、G3.arcs、G4.arcs。从运行结果可以看出与图7.9的形式一致。

(2)在图的邻接矩阵存储结构上也容易实现其它基本操作,比如,对于无向图G中返回顶点v的第一个邻接点位置的基本操作函数:int FirstAdjVex_MG(MGraph G,VType v)。

算法的实现过程是: 1) 根据顶点信息v,通过调用函数int LocateVex_MG(MGraph G,VType v)找到v在G中的位置i;

2) 在G的邻接矩阵中寻找第i行中第一个非零元素所在的列号j; 3) 如果j存在函数返回j+1,否则返回0值。

类似地可以给出函数:int NextAdjVex_MG(MGraph G,VType v,VType w)的算法实现代码。 (3)用邻接矩阵表示有n个顶点的图G时,查找边(或弧)的时间复杂度为O(n2)。由于邻接矩阵的存储空间仅与顶点数n有关,而与边无关,因此,当图G的顶点较多而边数又很少时,其边的查找效率会很低。为此,下面给出图的另一种存储结构,即图的邻接表表示法。

-.175.-

第7章 图结构

7.2.2邻接表表示法

图的邻接表表示是把图的每个顶点的邻接顶点用一个链表来表示。一般地,用顺序存储的方式来表示图中n个顶点的信息,另外,对图中每个顶点v建立一个单链表,用于表示与v相邻接的所有顶点的位置(下标)。链表中每个结点有两个域值:一个是顶点位置(下标)域,用于表示该邻接点的序号;另一个是指针域,用于指向下一个邻接点。

1.邻接表的定义

(1) 表结点 在邻接表中,对图中的每个顶点建立一个单链表,顶点v所对应的单链表中的结点(表示依附于该顶点的边或以v为尾的弧)称为表结点。图的表结点中包含有顶点位置域(adjvex)、指向下一条边(弧)的指针域(nextarc);而网的表结点中还要有表示相应权值的域(weight)。

(2) 头结点 在邻接表中每个单链表上附设一个结点,称为头结点。每个头结点由3个域组成:结点信息域(data)、结点访问次数域(flag)和指向链表中第一个结点的指针域(nextarc)。图中的所有头结点以顺序结构存储。

在图7.10中分别给出邻接表表结点的结构示图(a)和头结点的结构示图(b)。

例如,图7.11分别给出有向图G1和无向图G2的一种邻接表表示结构。

由于图中顶点的排列次序可以不同,每个顶点的邻接点的排列顺序也可以不同,所以,一个图的邻接表表示不唯一。

用邻接表表示具有n个顶点和e条边的无向图时,需要一个由n个元素组成的顺序表(表头结点表)和由2e个结点组成的n个单链表。而表示n个顶点和e条弧的有向图时,需要一个由n个元素组成的顺序表和由e个结点组成的n个单链表。当图中边(或弧)的数目远远少于图的顶点数目时,邻接表所需的存储空间要比邻接矩阵所需的少。

2.逆邻接表

-.176.-

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库《第7章 图结构》习题解答(2)在线全文阅读。

《第7章 图结构》习题解答(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/491223.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: