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. linux下Qt调用C++库文件(.so)程序实现
  2. timestamp与timedelta,管理信息系统概念与基础
  3. C++ Primer 5th笔记(chap 13 拷贝控制)综述
  4. 网络OSI和TCP/IP参考模型
  5. oppo如何更新计算机,OPPO工程师手把手教你固件升级
  6. GraphChi: Large-Scale Graph Computation on Just a PC
  7. Docker 系列之 常用镜像
  8. 2.Linux环境下配置Solr4.10.3
  9. fedora 安装chrome
  10. Oracle union all和order by一起使用
  11. python教程-Python2 教程
  12. pytorch---之BN层参数详解及应用(1,2,3)(1,2)?
  13. python 股票回测系统_Python爬虫回测股票的实例讲解
  14. 比较出名的几种美国主机
  15. 安装及配置 Mac 上的 Rime 输入法——鼠鬚管 (Squirrel)(也适用于小狼豪)
  16. STM32 CAN通信的学习笔记总结(从小白开始)
  17. 买一台服务器到底能干什么?可用于这7点!
  18. seo原创文章五种方法迎合搜索引擎收录和排名
  19. 建筑学计算机快速设计,建筑学专业可能会学的软件,什么样计算机好,设计软件对计算机配置的要求.docx...
  20. raid读写速度对比_RAID5和RAID10读写性能哪个更好些?

热门文章

  1. DFS和BFS概念及实践+acwing 842 排列数字(dfs) +acwing 844. 走迷宫(bfs)
  2. acwing算法基础课 844. 走迷宫
  3. KMZ转换为KML,KML转换为shp文件格式方法
  4. 智联招聘python岗位_智联招聘的python岗位数据结巴分词(一)
  5. PS/聚苯乙烯微球的制备方法
  6. CSS文本样式和CSS3文本效果以及背景
  7. 国际化RFID射频常用协议标准
  8. 【简书如何创建专题?】
  9. python爬虫之爬取简书中的小文章标题
  10. JPA实体继承实体的映射策略