1、图的定义及分类

图是由一组顶点和一组能够将两个顶点相连的边组成的

一般使用数字0V-1来表示一张含有 V 个顶点的图中的各个顶点

2、图的相关术语

相邻顶点:

当两个顶点通过一条边相连时, 我们称这两个顶点是相邻的, 并称该连接依附于这两个顶点

度数:

某个顶点的度数即为依附于它的边的总数

3、无向图的表示方法

1.邻接矩阵

我们可以使用一个 V 乘 V 的二维矩阵。 当顶点 v 和顶点 w 之间有相连接的边时, 定义 v 行 w 列的元素值为1, 否则为0。

2.邻接表

我们可以使用一个以顶点为索引的列表数组, 其中的每个元素都是和该顶点相邻的顶点列表

4、图的邻接表存储表示

我们需要定义三种结构

首先,我们要定义 边节点的结构,比如图中v3-v0这一条边,它包含了两个信息:这条边所属的顶点   指向该顶点下一条边的指针

如图所示,3代表了它连接v0和v3顶点,后面的指针域代表下一条边

//边的结构
typedef struct ArcNode
{int adjvex;//这条边所属的顶点ArcNode *nextarc;//指向该顶点下一条边的指针
}ArcNode; 

然后我们要定义表头节点,它包含了两个信息:顶点的信息,比如顶点的权值  指向该顶点的第一条边

typedef struct VexNode
{int data;//储存顶点的信息ArcNode* firstarc;//指向该顶点的第一条边
}VexNode,AdjList[Max];

注意理解Adjlist[Max]的含义,数组类型AdjList,它是由VexNode类型元素构成的,数组的长度为Max。Max表示图中顶点的个数。

换句话说,AdjList[MVNum]是一个数组类型,包含了Max个元素,每个元素都是VexNode类型的结构体,我们把AdjList称为邻接表类型

最后我们再定义无向图,它包含了两个信息:①邻接表  ②图的顶点数量和边数量

//图的结构
typedef struct
{AdjList list;int vexnum;int arcnum;
}AlGraph;

5、邻接表的构建

步骤:

①输入总顶点数,总边数
②输入各顶点的值
③输入各边所依附的两个顶点
④构建新的边节点(使用头插法)

bool CreateGraph(AlGraph& G)
{cout << "请输入总顶点数,边数" << endl;cin >> G.vexnum >> G.arcnum;cout << "请输入各顶点的值" << endl;//构建邻接表的顶点for (int i = 1; i <=G.vexnum; i++){cin >> G.list[i].data;G.list[i].firstarc = NULL;}cout << "请输入各边所依附的顶点" << endl;int i,j;int v1, v2;//构建新的边节点for (int k = 0; k < G.arcnum; k++){cin >> v1 >> v2;//v1,v2是一条边所对应的两个顶点//i,j表示顶点在邻接表中对应的下标i = LocateVex(G, v1);j = LocateVex(G, v2);//因为是无向图,所以一条边可以依附于两个顶点,所以我们要新创建两个边节点ArcNode* p1 = new ArcNode();ArcNode* p2 = new ArcNode();//头插法将新结点*p1插入顶点vi的边表头部 p1->adjvex = j;//注意区分下标,如果是插入顶点vi,那么下标就是j,反之如果插入顶点vj,那么下标就是ip1->nextarc = G.list[i].firstarc;G.list[i].firstarc = p1;//头插法将新结点* p2插入顶点vj的边表头部p2->adjvex = i;p2->nextarc = G.list[j].firstarc;G.list[j].firstarc = p2;}return true;
}

数据结构与算法————无向图相关推荐

  1. 数据结构与算法A实验六图论---7-11 邻接表创建无向图

    采用邻接表创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数. 输入第二行为顶点的信息,每个顶点只能用一个字符表 ...

  2. Java 数据结构和算法(十五):无权无向图

    Java数据结构和算法(十五)--无权无向图 前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做"树"是因为它看起 ...

  3. 数据结构与算法:22 精选练习50

    精选练习50 马上就要期末考试或者考研了.为了大家复习的方便,我精选了有关数据结构与算法的50道选择题,大家可以抽空练习一下.公众号后台回复"答案"可以获取该50道题目的答案. 0 ...

  4. 数据结构与算法-C++实现

    前沿 1.数据结构和算法的理解 答: 我们如何把现实中大量而复杂的问题,以特定的数据类型和特定的存储结构保存到主存储器(内存)中. (注:数据结构解决了数据存储的问题,比如要存储一个班级50人的成绩, ...

  5. 数据结构与算法—图论之dfs、bfs(深度优先搜索、宽度优先搜索)

    文章目录 前言 邻接矩阵和邻接表 深度优先搜索(dfs) 宽度(广度)优先搜索(bfs) 总结与比较 前言 在有向图和无向图中,如果节点之间无权值或者权值相等,那么dfs和bfs时常出现在日常算法中. ...

  6. 数据结构与算法必备的 50 个代码实现

    点击上方"AI有道",选择"置顶"公众号 重磅干货,第一时间送达 数据结构和算法是程序员的内功心法和基本功.无论是人工智能还是其它计算机科学领域,掌握扎实的数据 ...

  7. 数据结构与算法(C++)– 图(Graph)

    数据结构与算法(C++)– 图(Graph) 1.图的基础概念 定义:一个图G=(V, E)由顶点(vertex)的集V和边(edge)的集E组成. 边(edge):一对点即为一条边(v, w),其中 ...

  8. c++冒泡排序代码_数据结构和算法必知必会的50个代码实现

    今天在GitHub上发现了个非常不错的项目,目前star 4700+,项目主要讲数据结构和算法,有多种语言 50个代码实现. 实现语言有c++,c#,go,java,javascript,object ...

  9. 数据结构与算法--图论-深度优先搜索及其应用

    深度优先搜索 深度优先搜索(depth-first search) 是对先序遍历(preorder traversal)的推广,我们从某个顶点v开始处理v,然后递归的遍历所有与v邻接顶点.如果这个过程 ...

最新文章

  1. 产品设计体会(3000)项目与文档,系列说明
  2. mysql双主使用reset master清除日志要小心
  3. CentOS 5.4 rsync+inotify配置触发式(实时)文件远程同步
  4. 服务器cpu天梯图_九月手机处理器排名 2020年9月最新版手机CPU天梯图
  5. 简单的JSP登录程序
  6. matlab导出jar包错误Error: An error occurred while shelling out to javac(erro code = 1)解决办法...
  7. Visual Basic 9.0 前沿播报·静态篇(一)局部变量类型推测和数组初始化器
  8. 危机管理计划书模板_免费领!40套商业计划书PPT模板+10份知名公司商业计划书真实案例范文...
  9. 图解Android事件传递之ViewGroup篇
  10. postman 怎么调试pos_SpringBoot|第十五章:基于Postman的RESTful接口测试
  11. Windows下如何搭建Gradle环境?
  12. Spring-context-ConfigurationClassUtils类
  13. 用闭包方式实现点击a标签弹也索引值
  14. 每天Leetcode 刷题 初级算法篇-数学问题-罗马数字转整数
  15. mysql的数据类型5---enum与set类型
  16. Vue.js身份证读卡器阅读器谷歌chrome火狐Firefox网页实现读取方法
  17. Linux中vi命令详解
  18. qt使用 iostream 头文件
  19. 百度不收录网站的原因
  20. android 外接USB扫码器应用闪退解决方法

热门文章

  1. 中国计量大学计算机专业在哪个校区,2021年中国计量大学有几个校区,大一新生在哪个校区...
  2. 世界坐标系和图像坐标系的对应关系
  3. 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识 - A
  4. POV-RAY基础教程 - POV-Ray坐标系(7)
  5. Python环境的安装与配置
  6. 理解tfrecord读取数据——错误OutOfRangeError (see above for traceback)的解决
  7. 【费用流】loj#545. 「LibreOJ β Round #7」小埋与游乐场
  8. Spring单例Bean与单例模式的区别
  9. IOC和DI浅显易懂的理解
  10. 常见的HTT相应状态码