目录

一、初识图

(1)图的定义

(2)图的分类

二、图的存储结构

(1)邻接矩阵

(2)邻接表(无向图)

(3)其他


一、初识图

(1)图的定义

图(Graph)是由顶点的有穷非空集合(必须存在顶点)和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合

(2)图的分类

若顶点到顶点之间的边设有方向,则称这条边为无向边。如果图中任意两个顶点之间的边都是无向边,则称该图为无向图

若顶点到顶点的边有方向,则称这条边为有向边,也称为弧。如果图中任意两个顶点之间的边都是有向边,则称该图为有向图

除此之外还有:

  • 简单图
  • 无向完全图
  • 有向完全图
  • 稠密图
  • 带权图(网)
  • ...

二、图的存储结构

(1)邻接矩阵

图的邻接矩阵存储方式是用二维数组来表示图,我们来看一个实例

它的邻接矩阵为:

简单解释一下,对于矩阵的主对角线的值,即arc[0][0]、arc[1][1]、arc[2[2]、arc[3][3],全为0是因为不存在顶点到自身的边,比如。arc[0][1]=1是因为的边存在,而arc[1][3]=0是因为的边不存在。并且由于是无向图,的边不存在,意味着的边也不存在。所以无向图的边数组是一个对称矩阵。

有了这个矩阵,我们就可以很容易地知道图中的信息。

  1. 我们要知道某个顶点的度,其实就是这个顶点在邻接矩阵中第ⅰ行(或第i列)的元素之和。比如顶点1的度就是1+0+1+0=2。
  2. 求顶点M的所有邻接点就是将矩阵中第i行元素扫描一遍,arc[i][j]为1就是邻接点。

有向图的邻接矩阵也是一样

而如果是带权图的话,如果两个顶点可达,那么我们就将arc[i][j]的1变为他们两点之间的权值,如果两个顶点之间不可达,那么我们就将arc[i][j]的0变为无穷大。这里需要注意自己到自己的权值为0。

 邻接矩阵(无向图)的实现:

#include<iostream>
using namespace std;#define MAXVEX 100//最大顶点数
typedef char VertexType;//顶点类型
typedef int EdgeType;//边上的权值类型
typedef struct
{VertexType vexs[MAXVEX];//顶点表EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵int numVertexte;//当前顶点数int numEdges;//当前边数
}MGraph;void CreateMGraph(MGraph* G)//建立无向网图的邻接矩阵表示
{int i, j, k, w;cout << "请输入顶点数和边数:" << endl;cin >> G->numVertexte >> G->numEdges;for ( i = 0; i < G->numVertexte; ++i)//读入顶点信息,建立顶点表{cin >> G->vexs[i];}for (i = 0; i < G->numVertexte; ++i){for ( j = 0; j < G->numVertexte; ++j){G->arc[i][j] = INT_MAX;//邻接矩阵初始化}}for (k = 0; k < G->numEdges; ++k){cout << "输入边(vi,vj)上的下标i,下标 j 和权 w:" << endl;cin >> i >> j >> w;G->arc[i][j] = w;G->arc[j][i] = G->arc[i][j];}
}int main()
{MGraph G;CreateMGraph(&G);return 0;
}

(2)邻接表(无向图)

邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的。于是引出了链式存储的结构。

邻接表的处理办法是这样。

  1. 图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易地读取顶点信息,更加方便。另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。
  2. 图中每个顶点的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储。

例如

无向图的邻接表

有向图的邻接表

对于带权值的网图

邻接表(无向图)的实现

#include<iostream>
using namespace std;#define MAXVEX 100//最大顶点数
typedef char VertexType;//顶点类型
typedef int EdgeType;//边上的权值类型typedef struct EdgeNode
{int adjvex;//邻接点域,存储该顶点对应的下标EdgeType weight;//用于存储权值,对于非网图可以不需要struct EdgeNode* next;//指向下一个邻接点
}EdgeNode;typedef struct VertexNode //顶点表结点
{VertexType data;//存储顶点信息EdgeNode* firstedge;//指向该顶点的第一个相邻结点
}VertexNode,AdjList[MAXVEX];typedef struct
{AdjList adjList;int numVertexes;//当前顶点数int numEdges;//当前边数
}GraphAdjList;void CreateALGraph(GraphAdjList* G)//建立无向网图的邻接矩阵表示
{int i, j, k;EdgeNode* e;cout << "请输入顶点数和边数:" << endl;cin >> G->numVertexes >> G->numEdges;for ( i = 0; i < G->numVertexes; ++i)//读入顶点信息,建立顶点表{cin >> G->adjList[i].data;G->adjList[i].firstedge = nullptr;}for (k = 0; k < G->numEdges; ++k)//建立邻接表{cout << "输入边(vi,vj)上的顶点序号:" << endl;cin >> i >> j;e = new EdgeNode;e->adjvex = j;e->next = G->adjList[i].firstedge;G->adjList[i].firstedge = e;//头插法e = new EdgeNode;e->adjvex = i;e->next = G->adjList[j].firstedge;G->adjList[j].firstedge = e;//头插法}
}int main()
{GraphAdjList G;CreateALGraph(&G);return 0;
}

(3)其他

除上述两种方法之外,图的存储方式还有十字链表,邻接多重表,边集数组等。

一、图的定义,邻接矩阵和邻接表的实现相关推荐

  1. 图的存储-邻接矩阵和邻接表之间的相互转化

    邻接矩阵和邻接表之间的相互转化,输出邻接矩阵和邻接表算法实现. 将文件保存为GraphBasicOperation.cpp文件,具体实现如下: #include <stdio.h> #in ...

  2. 图的存储--邻接矩阵和邻接表(链表实现和用vector实现)

    邻接矩阵: #include<iostream> #include<vector> #include<iomanip> #include<string> ...

  3. 图的两种存储方式---邻接矩阵和邻接表

    图:图是一种数据结构,由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),V表示为顶点的集 合,E表示为边的集合. 首先肯定是要对图进行存储,然后进行一系列的操作,下面对图的两种存储方式邻 ...

  4. 将图的广度优先遍历在邻接矩阵和邻接表存储结构上分别实现_图解:什么是“图”?

    从今天开始,我们开始介绍图的相关算法 什么是"图" 1.背景 作为图的开始,我们先来看一个经典的问题,它被认为是图论的起源. 这个问题是基于一个现实生活中的事例:河中心有两个小岛. ...

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

    /** *    实验题目: *        实现图的邻接矩阵和邻接表存储 *    实验目的: *        领会图的两种主要存储结构和图基本运算算法设计 *    实验内容: *       ...

  6. 图的存储结构(邻接矩阵和邻接表)

    图的存储结构(邻接矩阵和邻接表) 前言: 前面我们学习图的有些定义和术语,对图这个数据结构有了新的见解和认知,让我们理解图结构的知识,今天我们学习图的存储结构,图的存储结构比较多,我们今天主要是学习邻 ...

  7. 图的创建(详解邻接矩阵和邻接表)

    首先,我们来看一下涉及的知识点: 图:图 G=(V,E) 由顶点集 V 和边集 E 组成.每条边对应一个点对 (v,w),其中 v,w 属于 V .如果图中的点对是有序的,那么该图就是有向图,反之为无 ...

  8. 有向无环图(邻接矩阵和邻接表)

    一.图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合. 注: 在线性表中,元素个数可以为零, ...

  9. 图——图的存储结构(邻接矩阵和邻接表法)

    图的五种存储结构: 1.图的邻接矩阵表示法 图是由顶点和边或弧两部分组成.图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组表示图,一个一维数组存储图中的顶点信息,一个二维数组(邻接 ...

  10. 图的两种存储形式(邻接矩阵、邻接表)

    图可以使用两种存储结构,分别是邻接矩阵和邻接表. 注意:一个图所对应的邻接矩阵唯一,所对应的邻接表不唯一 一.邻接矩阵 邻接矩阵以矩阵的形式存储图所有顶点间的关系.邻接矩阵具有以下特点: 1.邻接矩阵 ...

最新文章

  1. jQuery中blur和focus事件的应用
  2. ABAP Authorization trace工具
  3. 时间序列预测 时间因果建模_时间序列建模以预测投资基金的回报
  4. python条件语句练习题_python学习-7 条件语句 while循环 + 练习题
  5. Codeforces D - High Load
  6. java write阻塞_java socket/output stream writes:他们阻塞?
  7. DevExpress学习03——label控件的背景色问题
  8. 6.4-全栈Java笔记:异常处理办法(下)
  9. 永磁无刷电机及其驱动技术_「技术」某种车型后驱动桥装配工艺及其工装的设计...
  10. Spring Security简介和认识
  11. vue开发App商城实战项目
  12. java jmail_jmail和javamail的区别
  13. Chrome浏览器的跨域设置----包含新老版本两种设置
  14. 布莱克曼哈尔窗matlab,基于matlab的布莱克曼窗函数法设计的低通滤波器
  15. 如何通过JavaScript获取搜索引擎搜索关键词
  16. Android软键盘工具类
  17. TEB算法详解 参数详解
  18. CC00003.LBCHAC——|LBCHACHPC概述|
  19. C++数组去重与排序
  20. Contest3412 - 2022中石油大中小学生联合训练第七场

热门文章

  1. 计算机硬件基础课设总结,计算机硬件基础课程设计报告--简单计算机的设计.doc...
  2. Excel单元格自动添加边框
  3. 【数学建模】16 数学建模竞赛论文写作
  4. 群晖nas做文件服务器的安全性,更换NAS后,数据如何安全处理?聊聊NAS数据安全性那些事...
  5. 单片机补充案例--入侵检测系统
  6. [Excel图表]瀑布图的完美解决方案
  7. android qq 分享代码,Android将内容分享到QQ和微信实例代码
  8. 字符串处理(C++)
  9. 讯闪4.92带图片教程
  10. 企业邮箱邮件如何备份?公司邮件如何转发?