文档库 最新最全的文档下载
当前位置:文档库 › 已知以二维数组表示的图的邻接矩阵如下图所示。试分别画

已知以二维数组表示的图的邻接矩阵如下图所示。试分别画

已知以二维数组表示的图的邻接矩阵如下图所示。试分别画
已知以二维数组表示的图的邻接矩阵如下图所示。试分别画

1.已知以二维数组表示的图的邻接矩阵如下图所示。试分别画出自序号为0的顶点出发进

行遍历所得的深度优先生成树和广度优先生成树。

图题7.1

2.请对图题7.2的无向带权图,

(1)写出它的邻接矩阵,并按Prim算法求其最小生成树

(2)写出它的邻接表,并按Kruskal算法求其最小生成树

图题7.2 (注意:约定字符ASCII值小的物理存储也在前)

3.试按所述Dijkstra算法求图题7.3从顶点a到其他各定点间的最短路径,并写出执行过

程中Dist和Path的值的变化状况。

图题7.3

4.试列出图题7.4中全部可能的拓扑有序序列,并指出按7.5节中所描述的拓扑排序算法

求得的是哪个序列(注意:应确定其存储结构)

图题7.4

5.对于图题7.5所示的AOE网络,计算各事件(顶点)的ve(v i)和vl(v j)函数值以及各活动弧

的ee(a i)和el(a j)函数值。并列出各条关键路径。

图题7.5

思考题

6.试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由

顶点v i到顶点v j的路径(i≠j)。

图的邻接矩阵存储结构建立汇总

课程名称: 《数据结构》课程设计课程设计题目:图的邻接矩阵存储结构建立 姓名:XXX 院系:计算机学院 专业:计算机科学技术 年级:11级 学号:XXXXXXXX 指导教师:XXX 2013年9月28日

目录 1 课程设计的目的 (3) 2需求分析 (3) 3 课程设计报告内容 (3) 3.1 概要设计 (3) 3.2 详细设计 (4) 3.3 调试分析 (5) 3.4 用户手册 (5) 3.5 程序清单 (5) 3.6 测试结果 (10) 4 小结 (12) 5 参考文献 (12)

1.课程设计的目的 (1) 熟练使用 C 语言编写程序,解决实际问题; (2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; (3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; (4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 2.需求分析 问题描述:建立图的邻接矩阵存储结构(图的类型可以是有向图或有向网、无向图或无向网,学生可以任选一种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后给出图的DFS,BFS次序。 要求: ①先任意创建一个图; ②图的DFS,BFS的递归和非递归算法的实现。 3.课程设计报告内容 3.1概要设计 1.函数 ①主函数:main( ) ②创建无向图:CreateGraph( )

③深度优先遍历图:DFS( ) ④广度优先遍历图:BFS( ) 3.2详细设计 1.使用邻接矩阵作为图的存储结构,程序中主要用到的抽象数据类型: typedef struct { char vexs[MAX]; //顶点向量 int arcs[MAX][MAX]; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和弧数}Graph; 2.程序流程图:

图的矩阵表示及习题-答案讲解

177 图的矩阵表示 图是用三重组定义的,可以用图形表示。此外,还可以用矩阵表示。使用矩阵表示图,有利于用代数的方法研究图的性质,也有利于使用计算机对图进行处理。矩阵是研究图的重要工具之一。本节主要讨论无向图和有向图的邻接矩阵、有向图的可达性矩阵、无向图的连通矩阵、无向图和有向图的完全关联矩阵。 定义9.4.1 设 G =是一个简单图,V =?v 1,v 2,…,v n ? A (G )=(ij a ) n ×n 其中: 1j i v v v v a j i j i ij =???=无边或到有边到 i ,j =1,…,n 称A (G )为G 的邻接矩阵。简记为A 。 例如图9.22的邻接矩阵为: ?????? ? ? ?=011110101101 1010)(G A 又如图9.23(a)的邻接矩阵为: ?????? ? ? ?=0001101111000010 )(G A 由定义和以上两个例子容易看出邻接矩阵具有以下性质: ①邻接矩阵的元素全是0或1。这样的矩阵叫布尔矩阵。邻接矩阵是布尔矩阵。 ②无向图的邻接矩阵是对称阵,有向图的邻接矩阵不一定是对称阵。

178 ③邻接矩阵与结点在图中标定次序有关。例如图9.23(a)的邻接矩阵是A (G ),若将图9.23(a)中的接点v 1和v 2的标定次序调换,得到图9.23(b),图9.23(b)的邻接矩阵是A ′(G )。 ?????? ? ? ?='001010110001 1100)(G A 考察A (G )和A ′(G )发现,先将A (G )的第一行与第二行对调,再将第一列与第二列对调可 得到A ′(G )。称A ′(G )与A (G )是置换等价的。 一般地说,把n 阶方阵A 的某些行对调,再把相应的列做同样的对调,得到一个新的n 阶方阵A ′,则称A ′与A 是置换等价的。可以证明置换等价是n 阶布尔方阵集合上的等价关系。 虽然,对于同一个图,由于结点的标定次序不同,而得到不同的邻接矩阵,但是这些邻接矩阵是置换等价的。今后略去结点标定次序的任意性,取任意一个邻接矩阵表示该图。 ④对有向图来说,邻接矩阵A (G )的第i 行1的个数是v i 的出度, 第j 列1的个数是v j 的入度。 ⑤零图的邻接矩阵的元素全为零,叫做零矩阵。反过来,如果一个图的邻接矩阵是零矩阵,则此图一定是零图。 设G =为有向图,V =?v 1,v 2,…,v n ?,邻接矩阵为A =(a ij )n ×n 若a ij =1,由邻接矩阵的定义知,v i 到v j 有一条边,即v i 到v j 有一条长度为1的路;若a ij =0,则v i 到v j 无边,即v i 到v j 无长度为1的路。故a ij 表示从v i 到v j 长度为1的路的条数。 设A 2=AA ,A 2=(2 ij a )n ×n ,按照矩阵乘法的定义, nj in j i j i ij a a a a a a a +++= 22112 若a ik a kj =1,则a ik =1且a kj =1,v i 到v k 有边且v k 到v j 有边,从而v i 到v j 通过v k 有一条长 度为2的路;若 kj ik a a =0,则a ik =0或a kj =0,v i 到v k 无边或v k 到v j 无边,因而v i 到v j 通过 v k 无长度为2的路,k =1,…,n 。故2 ij a 表示从v i 到v j 长度为2的路的条数。 设A 3=AA 2,A 3=(3 ij a ) n ×n ,按照矩阵乘法的定义, 22222113nj in j i j i ij a a a a a a a +++= 若2kj ik a a ≠0,则ik a =1且2kj a ≠0,v i 到v k 有边且v k 到v j 有路,由于2kj a 是v k 到v j 长度为2 的路的条数,因而2kj ik a a 表示v i 到v j 通过v k 长度为3的路的条数;若2kj ik a a =0, ik a =0或2kj a =0, 则v i 到v k 无边或v k 到v j 无长度为2的路,所以v i 到v j 通过v k 无路,k =1,…,n 。故3 ij a 表示从v i 到v j 长度为3的路的条数。 …… 可以证明,这个结论对无向图也成立。因此有下列定理成立。 定理9.4.1 设A (G )是图G 的邻接矩阵,A (G )k =A (G )A (G )k-1,A (G )k 的第i 行,第j 列元素 k ij a 等于从v i 到v j 长度为k 的路的条数。其中k ii a 为v i 到自身长度为k 的回路数。 推论 设G =是n 阶简单有向图,A 是有向图G 的邻接矩阵,B k =A +A 2+…+A k ,

图的邻接矩阵和邻接表相互转换

图的邻接矩阵和邻接表相互转换 图的邻接矩阵存储方法具有如下几个特征:1)无向图的邻接矩阵一定是一个对称矩阵。 2)对于无向图的邻接矩阵的第i 行非零元素的个数正好是第i 个顶点的度()i v TD 。3)对于有向图,邻接矩阵的第i 行非零元素的个数正好是第i 个顶点的出度()i v OD (或入度 ()i v ID ) 。4)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连;但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所发费得时间代价大。 邻接表是图的一种顺序存储与链式存储相结合的存储方法。若无向图中有n 个顶点、e 条边,则它的邻接表需n 个头结点和2e 个表结点。显然,在边稀疏的情况下,用邻接表表示图比邻接矩阵存储空间。在无向图的邻接表中,顶点i v 的度恰好是第i 个链表中的结点数,而在有向图中,第i 个链表中结点个数是顶点i v 的出度。 在建立邻接表或邻逆接表时,若输入的顶点信息即为顶点的编号,则建立临接表的时间复杂度是)(e n O +;否则,需要通过查找才能得到顶点在图中位置,则时间复杂度为)*(e n O 。在邻接表上容易找到任意一顶点的第一个邻接点和下一个邻接点,但要判断任意两个顶点之间是否有边或弧,则需要搜索第i 个或第j 个链表,因此,不及邻接矩阵方便。 邻接矩阵和邻接表相互转换程序代码如下: #include #define MAX 20 //图的邻接表存储表示 typedef struct ArcNode{ int adjvex; //弧的邻接定点 char info; //邻接点值 struct ArcNode *nextarc; //指向下一条弧的指针 }ArcNode; typedef struct Vnode{ //节点信息 char data; ArcNode *link; }Vnode,AdjList[MAX]; typedef struct{ AdjList vertices; int vexnum; //节点数 int arcnum; //边数

用邻接矩阵表示法创建有向图(数据结构)

#include #include #include #define MAX_VERTEX_NUM 20 //定义最多顶点个数 #define INFINITY32768 //定义无穷大 //描述图的类型,用枚举型类型来说明 typedef enum{DG,DN,UDG,UDN}GraphKind; //定义顶点数据类型 typedef char V ertexData; //定义邻接矩阵中元素值(即边信息)的数据类型 typedef int ArcNode; //定义图的邻接矩阵类型:一个顶点信息的一维数组,一个邻接矩阵、当前图中包含的顶点数、边数以及图类型(有向图、有向网、无向图、无向网) typedef struct { V ertexData vertex[MAX_VERTEX_NUM]; ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vertexnum,arcnum; GraphKind kind; } AdjMatrix;//图的邻接矩阵表示类型 int LocateV ertex(AdjMatrix *G,V ertexData v) //求顶点位置函数 { int j=-1,k; for(k=0;kvertexnum;k++) { if(G->vertex[k]==v) { return k; } } return j; } int CreateDN(AdjMatrix *G) //创建一个又向网 { int i,j,k,weight; V ertexData v1,v2; printf("输入图的顶点数和弧数,以逗号分隔\n"); //输入图的顶点数和弧数 scanf("%d,%d",&G->vertexnum,&G->arcnum); for(i=0;ivertexnum;i++) //初始化邻接矩阵(主对角线元素全为零,其余元素为无穷大) {

数据结构与算法-图的邻接矩阵

实验报告实验日期:数据结构与算法课程: 图的邻接矩阵实验名称: 一、实验目的掌握图的邻接矩阵 二、实验内容必做部分 、给出图的邻接矩阵存储结构的类型定义。1 -1。v,返回其在vexs数组中的下标,否则返回2、实现LocateVex(G,v)操作函数:若找到顶点。、实现算法7.2(构造无向网)3&G) Status CreateUDN(MGraph 设计并实现无向网的输出算法,要求能显示顶点以及顶点之间的邻接关系(方式自定)4、 并进行输出。要求给出至少两组测试数据。在主函数中调用CreateUDN创建一个无向网,5、 选做部分 类型)编写下述操作函数:基于图的邻接矩阵存储结构(即MGraph若找不到这样返回该邻接点在顶点数组中的下标;1个邻接点,1、求下标为v的顶点的第-1。的邻接点,返回int FirstAdjVex(MGraph G,int v) 的顶点的下一个邻接点,返回该邻接点的下标;若w求下标为v的顶点相对于下标为2、找不到这样的邻接点,返回-1。 int NextAdjVex(MGraph G,int v,int w) 在主函数调用上述函数,给出测试结果。 三、实验步骤 必做部分 给出图的邻接矩阵存储结构的类型定义。、 1.

2、实现LocateVex(G,v)操作函数:若找到顶点v,返回其在vexs数组中的下标,否则返回-1。 3、实现算法7.2(构造无向网)。 &G) CreateUDN(MGraph Status

设计并实现无向网的输出算法,要求能显示顶点以及顶点之间的邻接关系(方式自定)、

4. 要求给出至少两组测试数据。并进行输出。、在主函数中调用CreateUDN创建一个无向网,5

数据结构课程设计-图的邻接矩阵

数据结构 课程设计报告 设计题目:图的邻接矩阵存储结构 院系计算机学院 年级x 级 学生xxxx 学号xxxxxxxxxx 指导教师xxxxxxxxx 起止时间10-6/10-10 2013年10月10日

目录 1 需求分析 (4) 2 概要设计 (4) 2.1 ADT描述 (4) 2.2程序模块结构 (5) 2.3各功能模块 (6) 3详细设计 (7) 3.1类的定义 (7) 3.2 初始化 (8) 3.3 图的构建操作 (8) 3.4 输出操作 (9) 3.5 get操作 (9) 3.6 插入操作 (10) 3.7 删除操作 (100) 3.8 求顶点的度操作 (111) 3.9 深度遍历作 (11) 3.10 判断连通操作 (12) 3.11 主函数 (13) 4 调试分析 (16) 4.1调试问题 (16) 4.2 算法时间复杂度 (16) 5用户手册 (16) 5.1主界面 (16) 5.2 创建图 (17) 5.3插入节点 (17) 5.4 深度优先遍历 (17) 5.5 求各顶点的度 (18) 5.6 输出图 (18) 5.7 判断是否连通 (19) 5.8 求边的权值 (19) 5.9 插入边 (19) 5.10 删除边 (20) 结论 (20) 参考文献 (20)

摘要 随着计算机的普及,涉及计算机相关的科目也越来越普遍,其中数据结构是计算机专业重要的专业基础课程与核心课程之一,为适应我国计算机科学技术的发展和应用,学好数据结构非常必要,然而要掌握数据结构的知识非常难,所以对“数据结构”的课程设计比不可少。本说明书是对“无向图的邻接矩阵存储结构”课程设计的说明。 首先是对需求分析的简要阐述,说明系统要完成的任务和相应的分析,并给出测试数据。其次是概要设计,说明所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次关系,以及ADT描述。然后是详细设计,描述实现概要设计中定义的基本功操作和所有数据类型,以及函数的功能及代码实现。再次是对系统的调试分析说明,以及遇到的问题和解决问题的方法。然后是用户使用说明书的阐述,然后是测试的数据和结果的分析,最后是对本次课程设计的结论。 关键词:网络化;计算机;对策;图;储存。

实现图的邻接矩阵和邻接表存储

实现图的邻接矩阵和邻接表存储 1.需求分析 对于下图所示的有向图G,编写一个程序完成如下功能: 1.建立G的邻接矩阵并输出之 2.由G的邻接矩阵产生邻接表并输出之 3.再由2的邻接表产生对应的邻接矩阵并输出之 2.系统设计 1.图的抽象数据类型定义: ADT Graph{ 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集 数据关系R: R={VR} VR={|v,w∈V且P(v,w),表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息} 基本操作P: CreatGraph(&G,V,VR) 初始条件:V是图的顶点集,VR是图中弧的集合 操作结果:按V和VR的定义构造图G DestroyGraph(&G) 初始条件:图G存在 操作结果:销毁图G InsertVex(&G,v) 初始条件:图G存在,v和图中顶点有相同特征 操作结果:在图G中增添新顶点v …… InsertArc(&G,v,w) 初始条件:图G存在,v和w是G中两个顶点 操作结果:在G中增添弧,若G是无向的则还增添对称弧 …… DFSTraverse(G,Visit()) 初始条件:图G存在,Visit是顶点的应用函数 操作结果:对图进行深度优先遍历,在遍历过程中对每个顶点调用函数Visit一次且仅一次。

一旦Visit()失败,则操作失败 BFSTraverse(G,Visit()) 初始条件:图G存在,Visit是顶点的应用函数 操作结果:对图进行广度优先遍历,在遍历过程中对每个顶点调用函数Visit一次且仅一次。一旦Visit()失败,则操作失败 }ADT Graph 2.主程序的流程: 调用CreateMG函数创建邻接矩阵M; 调用PrintMatrix函数输出邻接矩阵M 调用CreateMGtoDN函数,由邻接矩阵M创建邻接表G 调用PrintDN函数输出邻接表G 调用CreateDNtoMG函数,由邻接表M创建邻接矩阵N 调用PrintMatrix函数输出邻接矩阵N 3.函数关系调用图: 3.调试分析 (1)在MGraph的定义中有枚举类型 typedef enum{DG,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向图,无向网} 赋值语句G.kind(int)=M.kind(GraphKind);是正确的,而反过来M.kind=G.kind则是错误的,要加上那个强制转换M.kind=GraphKind(G.kind);枚举类型enum{DG,DN,UDG,UDN} 会自动赋值DG=0;DN=1,UDG=2,UDN=3;可以自动从GraphKind类型转换到int型,但不会自动从int型转换到GraphKind类型

图采用邻接矩阵存储结构

图采用邻接矩阵存储结构 #define TRUE 1 #define FALSE 0 #define MAXV 20 typedef int V ertexType; //用顶点编号表示顶点 typedef struct { // 图的定义 int edges[MAXV][MAXV] ; // 边数组 int n, e; //顶点数,弧数 V ertexType vexs[MAXV]; // 顶点信息 } MGraph; 1、创建具有n个顶点e条边的无向图 void CreateUDG(MGraph &G,int n,int e) { int i,j,u,v; G.n=n;G.e=e; /* printf("请输入%d个顶点的编号:\n",n); for(i=0;i

void CreateDG(MGraph &G,int n,int e) { int i,j,u,v; G.n=n;G.e=e; /* printf("请输入%d个顶点的编号:\n",n); for(i=0;i

邻接矩阵创建有向网的实现

韩山师范学院 实验题目: 邻接矩阵创建有向网算法实现 班级:2015级软工班作者:黄俊聪 #include using namespace std; #define MaxInt 32767 //表示极大值,即∞ #define MVNum 100 //最大顶点数 #define OK 1 #define ERROR 0; typedef char VerTexType;//假设顶点的数据类型为字符型 typedefintArcType;//假设边的权值类型为整型 typedefint Status; typedefstruct { VerTexTypevexs[MVNum];//顶点表 ArcType arcs[MVNum][MVNum];//邻接矩阵 intvexnum,arcnum;//图的当前点数和边数 }AMGraph; Status LocateVex(AMGraphG,char v) {

for(i=0; i>G.vexnum>>G.arcnum;//输入总定点数,总边数 cout<<"次输入点的信息:"<>G.vexs[i]; for(int i=0;i>v1>>v2>>w;//输入一条边依附的顶点及权值 i=LocateVex(G,v1); j=LocateVex(G,v2);//确定v1和v2在G中的位置,即顶点数组的下表 G.arcs[i][j]=w;//边的权值置为w } return OK; } void PrintMatrix(AMGraph&G)//输出邻接矩阵 { inti,j; printf("邻接矩阵为:\n"); for(i=0;i

邻接矩阵表示图深度广度优先遍历

*问题描述: 建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网,学生可以任选两种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。 1、邻接矩阵表示法: 设G=(V,E)是一个图,其中V={V1,V2,V3…,Vn}。G的邻接矩阵是一个他有下述性质的n阶方阵: 1,若(Vi,Vj)∈E 或∈E; A[i,j]={ 0,反之 图5-2中有向图G1和无向图G2的邻接矩阵分别为M1和M2: M1=┌0 1 0 1 ┐ │ 1 0 1 0 │ │ 1 0 0 1 │ └0 0 0 0 ┘ M2=┌0 1 1 1 ┐ │ 1 0 1 0 │ │ 1 1 0 1 │ └ 1 0 1 0 ┘ 注意无向图的邻接是一个对称矩阵,例如M2。 用邻接矩阵表示法来表示一个具有n个顶点的图时,除了用邻接矩阵中的n*n个元素存储顶点间相邻关系外,往往还需要另设一个向量存储n个顶点的信息。因此其类型定义如下: VertexType vertex[MAX_VERTEX_NUM]; // 顶点向量 AdjMatrix arcs; // 邻接矩阵 int vexnum, arcnum; // 图的当前顶点数和弧(边)数 GraphKind kind; // 图的种类标志

若图中每个顶点只含一个编号i(1≤i≤vnum),则只需一个二维数组表示图的邻接矩阵。此时存储结构可简单说明如下: type adjmatrix=array[1..vnum,1..vnum]of adj; 利用邻接矩阵很容易判定任意两个顶点之间是否有边(或弧)相联,并容易求得各个顶点的度。 对于无向图,顶点Vi的度是邻接矩阵中第i行元素之和,即 n n D(Vi)=∑A[i,j](或∑A[i,j]) j=1 i=1 对于有向图,顶点Vi的出度OD(Vi)为邻接矩阵第i行元素之和,顶点Vi 的入度ID(Vi)为第i列元素之和。即 n n OD(Vi)=∑A[i,j],OD(Vi)=∑A[j,i]) j=1j=1 用邻接矩阵也可以表示带权图,只要令 Wij, 若或(Vi,Vj) A[i,j]={ ∞, 否则。 其中Wij为或(Vi,Vj)上的权值。相应地,网的邻接矩阵表示的类型定义应作如下的修改:adj:weightype ; {weightype为权类型} 图5-6列出一个网和它的邻接矩阵。 ┌∞31∞∞┐ │∞∞51∞│ │∞∞∞∞∞│ │∞∞6∞∞│ └∞322∞┘ (a)网(b)邻接矩阵 图5-6 网及其邻接矩阵 对无向图或无向网络,由于其邻接矩阵是对称的,故可采用压缩存贮的方法,

邻接矩阵表示的带权有向图

实习报告——“邻接矩阵表示的带权有向图”演示程序 (一)、程序的功能和特点 主要实现的功能:1.使用邻接矩阵表示带权有向图; 2.查找指定顶点序号; 3.判断图是否为空; 4.判断图是否满; 5.取得顶点数、边数、一条边的权值; 6.插入一个顶点、边; 7.删除一个顶点、边; (二)、程序的算法设计 “邻接矩阵的表示”算法: 1.【逻辑结构与存储结构设计】 逻辑结构:非线性结构——网状结构 存储结构:内存中连续的存储结构,邻接矩阵 2.【基本操作设计】 按指定输入,生成图并打印该图 删除一个顶点并打印 删除一条边并打印 3. 【算法设计】 插入一个顶点的算法: 首先判断该图是否已满,若已满:插入失败; 否则进行插入:1.顶点表增加一个元素 2.邻接矩阵增加一行一列 删除一个顶点的算法: A F E D C B

判断要删除顶点的存在性,若不存在:出错; 否则:1.修改顶点表,即在顶点数组中删除 该点; 2.修改邻接矩阵,即需要统计与该顶 点相关联的边,并将这些边也删除4.【高级语言代码】 public class Graph { static int MaxEdges=50; static int MaxVertices=10; static int MaxValue=9999;//无穷大 //存放顶点的数组 private char VerticesList[]=new char[MaxVertices]; //邻接矩阵(存放两个顶点的权值) private int Edge[][]=new int[MaxVertices][MaxVertices]; private int CurrentEdges;//现有边数 private int CurrentVertices;//现有顶点数 //构造函数:建立空的邻接矩阵 public Graph(){ for(int i=0;i

建立图的邻接矩阵或邻接表存储并在此基础知识上实现图的深度和广度优先遍历

#include "stdafx.h" #include "conio.h" #include "stdio.h" #include "stdlib.h" typedef enum {FALSE, TRUE} BOOLEAN; #define OVERFLOW -1 #define OK 1 #define ERROR 0 #define INFINITY INT_MAX /* 最大值∞ */ /* 根据图的权值类型,分别定义为最大整数或实数 */ #define MAX_VERTEX_NUM 20 /* 最大顶点数目 */ typedef enum {DG, DN, UDG,UDN} GraphKind ; /* {有向图,有向网,无向图,无向网} */ BOOLEAN Visited[MAX_VERTEX_NUM]; BOOLEAN visited[MAX_VERTEX_NUM]; #define VEX_NUM 20 #define MAXSIZE 50 typedef char Vextype; typedef int ElemType; typedef int Status; ////////////////////////////// 邻接矩阵结构定义typedef struct { Vextype vexs[VEX_NUM]; int adj[VEX_NUM][VEX_NUM]; /*邻接矩阵*/ int n,e; /*顶点数和边数*/ }Mgraph;

////////////////////////////// 邻接表结构定义 typedef struct node { /*边结点*/ int adjvex; /*邻接点域*/ struct node * nextarc; /*指向下一个边结点的指针域*/ } EdgeNode; typedef struct vnode { //顶点结构,2个域,结点信息和第一个邻接点Vextype vertex; EdgeNode *firstedge; }VertexNode; typedef struct { //图结构 VertexNode adjlist[MAXSIZE]; int n,e; } ALGraph; //// int FirstAdjVex(ALGraph G,int v) {//在图G中寻找第v个顶点的第一个邻接顶点 if(!G.adjlist[v].firstedge) return -1; else return(G.adjlist[v].firstedge->adjvex); } int NextAdjVex(ALGraph G,int v,int w) {//在图G中寻找第v个顶点的相对于w的下一个邻接顶点 EdgeNode *p; int vi; p=G.adjlist[v].firstedge; if(!p) return -1;

数据结构实验报告无向图邻接矩阵存储结构

数学与计算机学院 课程设计说明书 课程名称: 数据结构与算法课程设计 课程代码: 6014389 题目: 无向图的邻接矩阵存储结构 年级/专业/班: 2018级软件4班 学生姓名: 吴超 学号: 312018********* 开始时间: 2018年12月9日 完成时间: 2018年12月30日 课程设计成绩: 指导教师签名:年月日 数据结构课程设计任务书

学院名称:数学与计算机学院课程代码:__6014389______ 专业:软件工程年级: 2018 一、设计题目 无向图的邻接矩阵存储结构 二、主要内容 图是无向带权图,对下列各题,要求写一算法实现。 1)能从键盘上输入各条边和边上的权值; 2)构造图的邻接矩阵和顶点集。 3)输出图的各顶点和邻接矩阵 4)插入一条边 5)删除一条边 6)求出各顶点的度 7)判断该图是否是连通图,若是,返回1;否则返回0. 8)使用深度遍历算法,输出遍历序列。 三、具体要求及应提交的材料 用C/C++语言编程实现上述内容,对每个问题写出一个算法实现,并按数学与计算机学院对课程设计说明书规范化要求,写出课程设计说明书,并提交下列材料: 1>课程设计说明书打印稿一份 2>课程设计说明书电子稿一份; 3>源程序电子文档一份。 四、主要技术路线提示 用一维数组存放图的顶点信息,二维数组存放各边信息。 五、进度安排 按教案计划规定,数据结构课程设计为2周,其进度及时间大致分配如下:

[1] 严蔚敏,吴伟民.数据结构.清华大学出版社出版。 [2] 严蔚敏,吴伟民. 数据结构题集(C语言版> .清华大学出版社.2003年5月。 [3]唐策善,李龙澎.数据结构(作C语言描述> .高等教育出版社.2001年9月 [4] 朱战立.数据结构(C++语言描述><第二版本).高等出版社出版.2004年4月 [5]胡学钢.数据结构(C语言版> .高等教育出版社.2004年8月 指导教师签名日期年月日 系主任审核日期年月日 目录

图的邻接矩阵的建立与输出

#include #include #include #define MAX_VERTEX_NUM 20 typedef int Arc_Type; typedef char VerTex_Type[5]; typedef enum { DG, DN, UDG, UDN }Graph_Kind; typedef struct ArcCell { Arc_Type adj; //Info_Type *info; }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { V erTex_Type vexs[MAX_VERTEX_NUM]; AdjMatrix arcs; int vertex_num; int arc_num; Graph_Kind kind; }MGraph; void Init_MGraph( MGraph &G ) { printf("输入图的定点数:"); scanf("%d", &G.vertex_num ); printf("输入图的边数:"); scanf("%d", &G.arc_num ); printf("输入图的类型(有向图:1 无向图:2 ):"); scanf("%d", &G.kind); int i, j; printf("输入节点向量(定点之间用空格隔开):"); for( i=0; i

有向图的邻接矩阵

有向图的邻接矩阵 设有向图,,。令为邻接到的边的条数,称为D的邻接矩阵,记作。 为图7.12的邻接矩阵,不难看出: (1)(即第i行元素之和为的出度),。 (2)(即第j列元素之和为的入度), 。 (3)由(1),(2)可知,为D中边的总数,也可看成是D中长度为1的通路总数,而为D中环的个数,即D中长度为1的回路总数。 D中长度大于等于2的通路数和回路数应如何计算呢? 为此,先讨论长度等于2的通路数和回路数。

在图D中,从顶点到顶点的长度等于2的通路,中间必经过一顶点。对于任意的k,若有通路,必有且,即。反之,若D中不存在通路,必有或,即。于是在图D中从顶点到顶点的长度等于2的通路数为: 由矩阵的乘法规则知,正好是矩阵中的第i 行与第j列元素,记,即就是从顶点到顶点的长度等于2的通路数,时,表示从顶点到顶点的长度等于2的回路数。 因此,即矩阵中所有元素的和为长度等于2的通路总数(含回路),其中对角线的元素和为长度等于2的回路总数。 根据以上分析,则有下面的推论。 定义有向图,,D中长度为的通路数和回路数可以用矩阵(简记)来表示,这里,其中 , 即

则为顶点到顶点长度为的通路数,为到自身长度为的回路数。中所有元素之和为D中长度为的通路数,而中对角线上元素之和为D中始于(终于)各顶点的长度为的回路数。 在图7.12中,计算,,如下: 观察各矩阵发现,,,。于是,D中到长度为2的通路有3条,长度为3的通路有4条,长度为4的通路有6条。由, ,可知,D中到自身长度为的回路各有1条(此时回路为 复杂的)。由于,所以D中长度为2的通路总数为10,其中有3条回路。 从上述分析,可得下面定理。 定理7.5设为有向图D的邻接矩阵,,则中元素 为到长度为的通路数,为D中长度为的通路总数,其中 为D中长度为的回路总数。 若再令矩阵 ,

C++邻接矩阵表示无向图

/*邻接矩阵表示图,先深遍历和先广遍历*/ #include #include #include #include #define numV 100 //顶点数 #define numE 100 //边数 using namespace std; bool visited[numV]; //访问标记数组 int dfn[numV]; //顶点的先深编号 //int count; //先深编号 template struct MGraph { T Vlist[numV]; //顶点表 int edge[numE][numE]; //邻接矩阵 }; template class Graph { public: void CreatGraph(); //邻接矩阵生成图 void outGraph(); //输出邻接矩阵 void DFST(); //先深遍历 void DFS_1(MGraph, int); //先深遍历之邻接矩阵的实现 void BFST(); //先广遍历 void BFS_1(MGraph, int); //先广遍历之邻接矩阵的实现private: int count; MGraph G; int n; //当前定点的个数 }; template void Graph::CreatGraph() { srand((unsigned)time(NULL)); int j; cout <<"请输入输入顶点数:";

图的邻接矩阵实现

图的邻接矩阵实现 用邻接矩阵存放图中顶点的关系,实现无向图的邻接矩阵存储。 1)图的建立,删除(添加,删除边/顶点) 2)广度和深度优先遍历 3)prim最小生成树 1,成员变量,构造函数,以及数组扩展 实现策略:维护一个顶点的数组,以及一个二维的数组来表示顶点之间的关系,维护2个基本变量记录顶点和边的数量。 重点是:1)可以动态扩展顶点数组,并保持数组的连续性,这意味着删除顶点时后面的顶点要前移,那么顶点的编号也变了,关系矩阵也要改变。2)关系矩阵也动态维护,随时保持和顶点数组一样大。顶点数组的长度为VNodes.length,实际存放了顶点的位置只到了size()处,对应的,关系矩阵的大小为int[VNodes.length][VNodes.length],实际有效地区域也只在左上角的int[size()][size()]范围内。 /*总是将关系矩阵保持和顶点数组大小对应,顶点数组不一定放满,关系矩阵也只 * 在左上角放满,顶点数组放满的大小为size(),关系矩阵也只到size()*/ private VNode[] VNodes; private int[][] M; private int nodeCount; private int edgeCount; public MatUnDirectedGraph() { VNodes = new VNode[5];

M = new int[5][5]; nodeCount = 0; edgeCount = 0; } public void expand() { VNode[] larger = new VNode[VNodes.length * 2];//顶点数组扩大 int[][] M_larger = new int[larger.length][larger.length];//关系矩阵也要扩展 for(int i = 0;i < VNodes.length;i++) { larger[i] = VNodes[i]; for(int j = 0;j < VNodes.length;j++) M_larger[i][j] = M[i][j]; } VNodes = larger; M = M_larger; } 复制代码 2,建图,删图相关方法分析 用邻接矩阵存储表示顶点之间的关系果然比邻接表在代码实现上简单很多 1)添加边,只需要在关系矩阵M的两个位置上赋值即可,而在邻接表实现中,要在2个顶点的边链表的最后都添加上一个边 2)删除边,1)的逆过程,将那2个位置的值置为0即可,而在邻接表的实现中,也是要到边

(完整版)邻接矩阵及拉普拉斯矩阵

邻接矩阵及拉普拉斯矩阵 邻接矩阵 图的邻接矩阵能够很方便的表示图的很多信息,且具有描述简单、直观的特点。无向简单图的邻接矩阵定义如下:设图G = (V ,E ) ,有n ≥ 1 个顶点,分别为:12,,,n v v v L 则G 的邻接矩阵 A 是按如下定义的一个n 阶方阵。 1v =a a =0,i j ij n n ij A ?∈?? ?, (,v )E () , 否则 直观上,由邻接矩阵我们可以得到如下信息: 1.邻接矩阵是一个0,1的对称矩阵,对角线元素为0。 2.矩阵的各个行和(列和)是各个顶点的度。所有元素相加和为边数的二倍。 3. A n 的i , j 位置元素为v i j 与v 之间的长度等于n 的通路的数目,而i ,j 位置的元素为 v i 到自身的回路的数目。特别的2A 的i,i 位置元素是v i 的度;3A 的i,i 位置元素是含v i 的 三角形数目的二倍。 4.由3.设1 (1)l k l k S A l == ≥∑,则l S 中,i j 位置元素(),S l i j 为顶点i v 与v j 之间长度小于或 等于l 的通路的个数。若(n-1),S 0i j =,则说明i v 与v j 之间没有通路。由此我们可以得到一个判断图G 的联通新的重要准则:对于矩阵1 l k l k S A ==∑,若S 中所有元素都非零则G 是连 通图,否则图G 是非连通图。 5.设G 是连通图,将矩阵 A 的所有是1的元素换成?1,并且把对角线元素ii a 换成相 应顶点i v 的度, i=1,2,,n L (),则所得到的矩阵的任何元素的代数余子式都相等,等于G 的生成树的数目。

相关文档
相关文档 最新文档