图的逻辑结构为多对多,图没有顺序存储结构,但可以借助二维数组来表示元素间的关系,即数组表示法(邻接矩阵)。图的链式存储结构可以用多重链表来描述,如邻接表,邻接多重表以及十字链表等。

邻接矩阵

  • 数组(邻接矩阵)表示法:
    建立一个邻接表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点间的关系)。
    1.设图A=(V,E)有n个顶点,则有顶点表Vexs[n]如下,
i 0 1 2 ⋯ \cdots ⋯ n-1
Vexs[i] v 1 v_1 v1​ v 2 v_2 v2​ v 3 v_3 v3​ ⋯ \cdots ⋯ v n v_n vn​

2.图的邻接矩阵是一个二维数组A.arcs[n][n],定义为:
A . a r c s [ i ] [ j ] = { 1 &ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace; 如 果 &lt; i , j &gt; ∈ E 或 者 ( i , j ) ∈ E 0 &ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace; 否 则 A.arcs[i][j] = \left\{ {\begin{array}{l} {1\;\;\;\;\;\; 如果&lt; i,j &gt; \in E或者(i,j) \in E}\\ {0\;\;\;\;\;\;否则} \end{array}} \right. A.arcs[i][j]={1如果<i,j>∈E或者(i,j)∈E0否则​

无向图的邻接矩阵

  • 例子:
  • 特点:
    1.无向图的邻接矩阵是对称的,且主对角线元素全为0(因为自己到自己没有边)。
    2.顶点i的度=第i行(列)中1的个数。
    3.完全图的邻接矩阵中,主对角元素为0,其余全为1。

有向图的邻接矩阵

  • 例子:

    在有向图的邻接矩阵中,
    第i行的含义:以结点 v i v_i vi​为尾的弧(出度边);
    第i列的含义:以结点 v i v_i vi​为头的弧(入度边);

  • 特点:
    1.有向图的邻接矩阵可能不是对称的。
    2.顶点的出度=第i行元素之和;
       顶点的入度=第i列元素之和;
       顶点的=第i行元素之和+第i列元素之和。

网的邻接矩阵

  • 网的邻接矩阵表示法:
    A . a r c s [ i ] [ j ] = { W i j &ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace; &lt; v i , v j &gt; 或 ( v i , v j ) ∈ V R ∞ &ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace; 无 边 ( 弧 ) A.arcs[i][j] = \left\{ {\begin{array}{l} {{W_{ij}}\;\;\;\;\;\; &lt; {v_i},{v_j} &gt; 或({v_i},{v_j}) \in VR}\\ {\infty \;\;\;\;\;\;\;\;\;无边(弧)} \end{array}} \right. A.arcs[i][j]={Wij​<vi​,vj​>或(vi​,vj​)∈VR∞无边(弧)​

  • 例子:

邻接矩阵的具体实现

  • 邻接矩阵的存储表示:用两个数组分别存储顶点表邻接矩阵
#define MaxInt 32767             //表示极大值,即无穷大
#define MVNum 100                //最大顶点数
typedef char VerTexType;         //设顶点的数据类型为字符型
typedef int ArcType;             //假设边的权值类型为整型typedef struct
{VerTexType vexs[MVNum];      //顶点表ArcType arcs[MVNum][MVNum];  //邻接矩阵int vexnum, arcnum;          //图的当前点数和边数
}AMGraph;  // Adjacency Matrix Graph
  • 采用邻接矩阵表示法创建无向网

    • 算法思路

      • 1.输入总顶点数和总边数(为vexnum和arcnum赋值)
      • 2.依次输入点的信息存入顶点表中(为vexs[i]赋值)。
      • 3.初始化邻接矩阵,使每个权值初始化为极大值。
      • 4.构造邻接矩阵
    • 算法描述:
Status CreateUDN(AMGraph &G)
{cin >> G.vexnum >> G.arcnum;              //输入总顶点数,总边数for (i = 0; i < G.vexnum; ++i)            cin >> G.vexs[i];                     //依次输入顶点的信息for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j)G.arcs[i][j] = MaxInt;            //边的权值均置为极大值(无穷大)for (k = 0; k < G.arcnum; ++k)            //构造邻接矩阵{ cin >> v1 >> v2 >> w;                 //输入一条边所依附的顶点及边的权值i = LocateVex(G, v1);            j = LocateVex(G, v2);                 //确定v1和v2在G中的位置G.arcs[i][j] = w;                     //边<v1,v2>的权值为wG.arcs[j][i] = G.arcs[i][j];          //置<v1,v2>地对称边<v2,v1>的权值为w}return OK;
}

其中的LocateVex函数表示查找某顶点在顶点表中的位置,具体如下,

//在图G中查找顶点u,存在则返回其在顶点表中的下标,否则返回-1
int LocateVex(AMGraph G, VerTexType u)
{int i;for (i = 0; i < G.vexnum; ++i)if (u == G.vexs[i])return i;return -1;
}
  • 采用邻接矩阵表示法创建其它图
    在前面创建无向网的基础上,只需经过一点修改,就可以创建无向图,有向网和有向图,操作如下图,

邻接矩阵表示法的优缺点

  • 优点:

    • 直观、简单、好理解
    • 方便检查任意一对顶点间是否存在边
    • 方便找任一顶点的所有“邻接点”(有边直接相连的顶点)
    • 方便计算任一顶点的“度”。
  • 缺点:

    • 不便于增加和删除顶点
    • 浪费空间——存稀疏图(点很多而边很少)有大量无效元素
      • 对稠密图(特别是完全图)还是很合算的
    • 浪费时间——统计稀疏图中一共有多少条边

数据结构之图(二)——邻接矩阵相关推荐

  1. 【数据结构】图(最短路径Dijkstra算法)的JAVA代码实现

    最短路径的概念 最短路径的问题是比较典型的应用问题.在图中,确定了起始点和终点之后,一般情况下都可以有很多条路径来连接两者.而边或弧的权值最小的那一条路径就称为两点之间的最短路径,路径上的第一个顶点为 ...

  2. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  3. 【数据结构】图的存储结构(邻接矩阵、邻接表、十字链表、邻接多重表)及实现(C语言)

    目录 1. 邻接矩阵表示法 1.1 图的邻接矩阵 1.2 创建有向网的邻接矩阵 2. 邻接表表示法 2.1 图的邻接表存储结构 2.2 创建有向图的邻接表 3. 十字链表表示法 3.1 图的十字链表存 ...

  4. [转]数据结构:图的存储结构之邻接矩阵

    图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图.一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n ...

  5. 数据结构——图的邻接矩阵实现

    图的邻接矩阵是用两个数组来表示图 一个一维数组vexs[MAXVER];用来存储顶点元素 一个二维数组arc[MAXVER][MAXVER];用来存储图的边或者弧度以及证明其存在 无向图的的二维数组 ...

  6. 数据结构与算法王卓-习题-第六章图-采用邻接矩阵表示图的深度优先搜索遍历(DFS)算法

    目录 算法描述 算法预期效果 重难点 思路 个人解法 测试样例与输出 算法描述 创建图的邻接矩阵, 并输出dfs深度优先搜索遍历结果 算法预期效果 依次输入顶点数,边数,顶点V1~Vn,边A1~An, ...

  7. (九)数据结构之“图”

    数据结构之"图" 图是什么 图的常用操作 图的深度/广度优先遍历 什么是深度/广度优先遍历 深度优先遍历算法口诀 广度优先遍历算法口诀 LeetCode:65.有效数字 LeetC ...

  8. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

  9. 【恋上数据结构】图基础知识介绍

    图 数据结构回顾 图(Graph) 有向图(Directed Graph) 出度.入度 无向图(Undirected Graph) 混合图(Mixed Graph) 简单图.多重图 无向完全图(Und ...

最新文章

  1. C语言求3x3数组对角线元素之和
  2. python字符串压缩字_gzip如何在Python中压缩字符串?
  3. 编译原理练习题(第二章)
  4. 2023届IC实习小结
  5. 我的世界服务器玩家在线时间,将公布上线时间?我的世界中国版网易520前瞻
  6. 微信小程序报错 .wxss 无法找到
  7. python *args和**kwargs以及序列解包
  8. mysql 太多字段 排除某一列_Atitit 数据库排除某一列 字段 显示
  9. 【转载】浅析输入法原理
  10. python index 报错_python基础语法常见报错类型
  11. DataX离线数据同步工具/平台
  12. vb怎么判断整数_VB数学函数大全
  13. 【kafka】kafka 消息头的强大功能
  14. python反转排列_生成列表元素对的每个排列,而不重复或反转对
  15. linux数据向量化指令,不充分SIMD向量化技术研究.PDF
  16. CCS安装多版本编译器 Compiler version__更新手动下载、安装方法
  17. HHL论文第二弹(基本过程)
  18. c语言顺序结构编程题及其答案,C语言编程 顺序结构编程练习题目
  19. ensp-VRRP的配置
  20. 无刷直流电机 PWM控制

热门文章

  1. 图书采购管理系统分析
  2. 使用ajax从服务器端获取数据
  3. int8 和 uint8 区别
  4. android远程控制win10,微软推出适用于Win10专业版的Android远程控制
  5. 常见的噪声:高斯、泊松和椒盐噪声
  6. 四_【Java_程序逻辑控制】
  7. 几大厂商的hypervisors比较分析
  8. Warning: Can save best model only with val_acc available, skipping
  9. 14个10G电口模块(10GBase-T)的相关问题
  10. 王阳明心学层级图——适合内心困惑的人了解