首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将邻接矩阵转换为邻接表表示图

基础概念

邻接矩阵是一种表示图的数据结构,其中矩阵的行和列分别代表图中的顶点,矩阵中的元素表示两个顶点之间的连接关系。如果顶点 i 和顶点 j 之间有边,则矩阵的第 i 行第 j 列的元素为 1(或边的权重),否则为 0。

邻接表是另一种表示图的数据结构,它为每个顶点维护一个列表,列表中包含所有与该顶点相邻的顶点及其边的权重。

转换过程

将邻接矩阵转换为邻接表的过程如下:

  1. 初始化邻接表:创建一个列表,列表中的每个元素是一个字典,字典包含两个键:“vertex”表示顶点,“weight”表示边的权重。
  2. 遍历邻接矩阵:对于邻接矩阵中的每一个元素,如果元素的值不为 0,则在对应的邻接表中添加一条记录。
  3. 构建邻接表:将所有顶点的邻接信息存储在邻接表中。

代码示例

以下是一个 Python 示例代码,展示如何将邻接矩阵转换为邻接表:

代码语言:txt
复制
def adjacency_matrix_to_list(matrix):
    n = len(matrix)  # 图的顶点数
    adj_list = []  # 初始化邻接表
    
    for i in range(n):
        vertex_adj = []  # 当前顶点的邻接列表
        for j in range(n):
            if matrix[i][j] != 0:
                vertex_adj.append({"vertex": j, "weight": matrix[i][j]})
        adj_list.append(vertex_adj)
    
    return adj_list

# 示例邻接矩阵
adj_matrix = [
    [0, 1, 0, 2],
    [1, 0, 3, 0],
    [0, 3, 0, 4],
    [2, 0, 4, 0]
]

# 转换为邻接表
adj_list = adjacency_matrix_to_list(adj_matrix)
print(adj_list)

输出结果

代码语言:txt
复制
[
    [{'vertex': 1, 'weight': 1}, {'vertex': 3, 'weight': 2}],
    [{'vertex': 0, 'weight': 1}, {'vertex': 2, 'weight': 3}],
    [{'vertex': 1, 'weight': 3}, {'vertex': 3, 'weight': 4}],
    [{'vertex': 0, 'weight': 2}, {'vertex': 2, 'weight': 4}]
]

应用场景

  • 邻接矩阵适用于稠密图(边数接近顶点数的平方),因为它的空间复杂度是 O(V^2),其中 V 是顶点数。
  • 邻接表适用于稀疏图(边数远小于顶点数的平方),因为它的空间复杂度是 O(V + E),其中 E 是边数。

优势

  • 邻接矩阵的优势在于可以快速检查两个顶点之间是否有边(O(1) 时间复杂度),并且可以方便地获取边的权重。
  • 邻接表的优势在于节省空间,特别是对于稀疏图,并且可以方便地遍历一个顶点的所有邻接顶点。

遇到的问题及解决方法

问题:在转换过程中,可能会遇到矩阵元素为负数或非数字的情况。

原因:这可能是由于输入数据不正确或矩阵表示有误。

解决方法:在转换之前,检查矩阵中的每个元素是否为有效的边权重(通常是正数或 0)。如果不是,可以抛出异常或进行相应的处理。

代码语言:txt
复制
def adjacency_matrix_to_list(matrix):
    n = len(matrix)
    adj_list = []
    
    for i in range(n):
        vertex_adj = []
        for j in range(n):
            if not isinstance(matrix[i][j], (int, float)) or matrix[i][j] < 0:
                raise ValueError(f"Invalid weight at position ({i}, {j}): {matrix[i][j]}")
            if matrix[i][j] != 0:
                vertex_adj.append({"vertex": j, "weight": matrix[i][j]})
        adj_list.append(vertex_adj)
    
    return adj_list

通过这种方式,可以确保转换过程的正确性和鲁棒性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【数据结构实验】(二)邻接矩阵存储转换为邻接存储

引言   是一种常见的数据结构,用于表示对象之间的关系。在表示方法中,邻接是一种常用的形式,特别适用于稀疏。 本实验介绍如何使用邻接表示,并通过C语言实现邻接创建。 2....邻接表示的原理 2.0 的基础知识 a. 类型   (Graph)是由节点(Vertex)和节点之间的边(Edge)组成的一种数据结构。可以用来表示不同对象之间的关系或连接方式。...表示   可以用多种方式表示,常见的有邻接矩阵(Adjacency Matrix)和邻接(Adjacency List)两种形式。 邻接矩阵是一个二维数组,用于表示节点之间的连接关系。...对于有向邻接矩阵的元素表示从一个节点到另一个节点的边的存在与否;对于无向邻接矩阵是对称的。 邻接是一种链表数组的形式,用于表示每个节点和与之相连的边。...实验内容 3.1 实验题目   邻接矩阵存储转换为邻接存储 (一)数据结构要求   邻接中的顶点用Head 数组存储,顶点中元素的两个域的名字分别为 VerName和 Adjacent,边结点的两个域的名字分别为

11410

的遍历(上)——邻接矩阵表示

概述 作为数据结构书中较为复杂的数据结构,对于的存储方式分邻接矩阵邻接两种方式。在这篇博客中,主要讲述邻接矩阵下的的深度优先遍历(DFS)与广度优先遍历(BFS)。...---- 广度优先遍历(BFS) BFS 算法的思想是:对一个无向连通,在访问图中某一起始顶点 v 后,由 v 出发,依次访问 v 的所有未访问过的邻接顶点 w1, w2, w3, …wt;然后再顺序访问...} } this->isvisited[vertex] = 0; } ---- 深度优先遍历(DFS)——非递归版本 非递归算法: 1)首先初始化待使用栈,然后第一个结点入栈...2)然后只要栈不空,重复下面的操作:栈顶元素弹出,然后看该元素是否访问过 3)若没访问过,则访问,置访问标记,然后将该元素的所有未被访问的相邻顶点入栈(注意是全部,所以应用一个for或while...#include using namespace std; class Graph{ private: int** G; //邻接矩阵

95220
  • 【图论-存邻接矩阵 邻接 链式前向星

    这篇文章主要来讲一下邻接矩阵 邻接 链式前向星(本篇需要具备一定的基础知识,至少邻接矩阵之前要会,这里主要讲解邻接和链式前向星) 我不大喜欢说废话,所以直接上图 邻接矩阵:用二维数组存储点与点之间的关系...,也就是这样 但是仔细想想,有很多不必要的空间浪费,比如说(2,5)这个空间就没有必要,那我们可以像一个办法来去掉这些多余的空间,邻接矩阵我们用的是二维数组,那这里我们想一下,根据每一个点到另一个点不同...没错,所以在一定程度上,我认为邻接其实就是邻接矩阵把那些没必要的点给扣掉。...edge; //这里使用动态数组,使用普通数组也是可以的 vectore; vectorhead;//建议从1开始存,其值是指向一个e的下标 其实链式前向星,我个人觉得,可以简单理解为邻接的降为...0]的next;后面同理,如果又要插入一条边为1 4 3的话,那e[1]的话,存储的值就是:4 3 0(0是head[1]插入当前结点之前的值),这样我们就有把它像邻接一样给连起来了。

    56853

    【数据结构与算法】 ( 的存储形式 | 的基本概念 | 表示方式 | 邻接矩阵 | 邻接 | 的创建 | 代码示例 )

    文章目录 一、的存储形式 二、的基本概念 三、表示方式 1、邻接矩阵 2、邻接 四、的创建 ( 代码示例 ) 一、的存储形式 ---- 线性 中的元素 , 有 一个 直接前驱 和 一个...结点之间的边 有方向 ; 节点之间的边有箭头 ; 带权 : 边 是有 权重 的 , 计算时不仅要计算路径 , 还要考虑路径的权重 ; 三、表示方式 ---- 表示方式 : 邻接矩阵 : 二维数组...; 邻接 : 链表 ; 1、邻接矩阵 中有 6 个结点 , 0 ~ 5 ; 使用 6x6 的矩阵 表示 , 第 i 行 第 j 列 的元素表示 结点 i 和 结点 j 是否连接 ; 默认情况下...有边连接 ; 2、邻接 邻接矩阵 要 为 n 个顶点 分配 n x n 大小的空间 , 存储结点间的边是否存在 , 这样会造成一定的损失 ; 邻接 中 , 只存储 存在的 边 , 不存储 不存在的...边 ; 邻接 底层数据结构 由 数组 + 链表 组成 ; 上图中 , 邻接 左侧的 0 ~ 5 表示 标号为 0 ~ 5 之间的结点 ; 第一行 0 : 1 -> 2 -> 3 ->4 -> 表示

    2.3K20

    【数据结构与算法】的基本结构介绍 | 邻接邻接矩阵编码实战

    作者 :“大数据小禅” 文章简介:本篇文章对基本数据结构 进行了一个概述,并使用领接矩阵与邻接的方式来实现一个 个人主页: 大数据小禅 的基本结构介绍 的应用 的分类 的应用...– 无权 表示 邻接矩阵 顶点与顶点是相连的,用1来表示,不相连则用0。...static int E; //邻接矩阵 private static int[][] adj; //存放边的信息 private int[][] edges;...public ArrayList adj(int v){ //验证v是否合法 validateVertex(v); //这里的逻辑可以对比对应的邻接矩阵...邻接它主要就是关心的是存在的边,不存在的边则不管,因此的话不会有空间上的浪费,邻接=数组+链表。

    52410

    详解第一篇:的基本概念及其存储结构(邻接矩阵邻接

    2.1 邻接矩阵 首先我们来学习的第一种存储结构——邻接矩阵邻接矩阵是如何保存的顶点和边呢?...因为节点与节点之间的关系就是连通与否,即为0或者1,因此邻接矩阵(二维数组)即是:先用一个数组顶点保存,然后采用矩阵来表示节点与节点之间的关系(边) 比如: 值为1就表示对应的这两个顶点是连通的...,为0就表示两个顶点不连通 那其实观察上面的我们可以发现: 无向邻接矩阵是对称的,第i行(列)元素之和,就是顶点i的度(边没有权值,只存0/1的情况下,元素和就是度) 有向邻接矩阵则不一定是对称的...用邻接矩阵存储的优点是能够快速知道两个顶点是否连通,取到权值 3....适合存储稀疏(边比较少的),因为邻接的话有多少边链表里面就存几个对应的顶点,不需要额外的空间;而上面邻接矩阵不论边多边少都要开一个N*N的矩阵(二维数组),边少的时候那就大部分位置都存的是0 2

    3.6K10

    OJ刷题记录:无向邻接矩阵表示法验证程序 题目编号:515

    无向邻接矩阵表示法验证程序 题目编号:515 题目描述: 采用邻接矩阵表示无向,完成的创建、的深度优先遍历、的广度优先遍历操作。其中的顶点信息是字符型,图中顶点序号按字符顺序排列。...本输入样例中所用的如下所示: 输入描述 第一行输入两个值,第一个是图中顶点的个数,第二个是图中边的条数 第二行输入各顶点的信息,即输入每个顶点字符 第三行开始输入每条边,每条边的形式为两个顶点的序号...,中间以空格隔开,输入完一条边换行 输出描述 首先输出的顶点信息,输出完毕换行 接着输出邻接矩阵,假如图中有n个顶点,则输出形式为n行n列的邻接矩阵,输出完毕换行 接下来一行输出从的第一个顶点开始进行深度优先遍历的序列...,中间以空格隔开,输出完毕换行 最后一行输出从的第一个顶点开始进行广度优先遍历的序列,中间以空格隔开,输出完毕换行 输入样例 5 7 A B C D E 0 1 0 2 0 3 1 2...A B C D E 0 1 1 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 A B C E D A B C D E 解题思路: 坑点:输入的可能含有多个连通分量

    81131

    文心一言 VS 讯飞星火 VS chatgpt (299)-- 算法导论22.1 3题

    文心一言: 为了从有向 G 计算出其 G^T,我们可以分别针对邻接链表和邻接矩阵两种表示形式来设计算法。下面我分别给出这两种方法的描述以及相应的 Go 语言代码实现。 1....邻接矩阵表示邻接矩阵中,矩阵的每个元素 A[i][j] 表示从节点 i 到节点 j 是否存在边。为了得到,我们只需将矩阵置即可。 算法步骤: 1....因为我们需要遍历整个矩阵并进行置操作。 360智脑: 邻接链表表示法 在邻接链表表示法中,我们可以直接遍历原图G的每个节点的邻接链表,然后每条边的方向反转后添加到新G^{T}的对应节点上。...邻接矩阵表示法 在邻接矩阵表示法中,我们可以通过交换矩阵的行和列来得到。...在邻接矩阵表示中,矩阵的行和列代表的顶点,矩阵中的元素表示相应顶点之间的边。意味着我们需要交换原图中边的方向。 下面分别给出使用邻接链表和邻接矩阵表示的有向置的算法,并使用Go语言实现。

    9520

    文心一言 VS 讯飞星火 VS chatgpt (300)-- 算法导论22.1 4题

    这里$E^{'}$是$E$中的冗余边和自循环边删除后余下的边。删除余边指的是两个结点之间的多条边替换为一条边。如果要写代码,请用go语言。...对于邻接矩阵表示的有向,我们可以通过原图的邻接矩阵进行置操作来得到新邻接矩阵。具体步骤如下: 1. 创建一个新的大小为 |V| \times |V| 的矩阵 G^{T},初始化为全零矩阵。...智谱清言: 在表示中,邻接链表和邻接矩阵都是常用的方法。邻接链表用于表示无向和有向,而邻接矩阵通常用于表示无向。对于有向置,我们可以分别对邻接链表和邻接矩阵进行操作。...v.Visited{ fmt.Println(g.Name,"->", v.Name) PrintGraph(v) } } } 邻接矩阵置 对于邻接矩阵表示的有向可以通过原图的每一行变成新的对应列来实现...下面我分别介绍这两种情况下的算法,并提供Go语言的示例代码。 邻接链表表示 对于邻接链表表示,我们可以通过遍历每个顶点的邻接列表,然后为每个邻接点添加一条反向边来实现置。

    13320

    机器学习入门:基本概念介绍

    我们可以计算平均度为: 这里的 邻接矩阵表示的另一种方式,其中行和列表示节点,交集表示一个节点的两个节点之间是否存在链接。邻接矩阵的大小是n x n(顶点数)。...,你要计算两次边(由于邻接矩阵是对称的,要计算两次相同的边),所以除以2 对于有向,可以表示两个不同的邻接矩阵,一个表示入度,一个表示出度 对于一个节点,总边数是入度和出度之和: 我们计算一个节点的入度和出度以及总边数...如果置一个无向邻接矩阵是没有改变的因为是对称的,但如果置一个有向邻接矩阵,边则进行了方向的转换。...除了邻接矩阵,我们还可以表示为一个边的列表: 但是这种方法对于机器学习分析是有问题的,所以就出现了一种常用的方法:邻接,因为邻接对大型和稀疏的节点很有用,它允许快速检索节点的邻居。...循环是路径开始和结束于同一节点的,因为不同的算法都有循环问题(所以有时需要通过切断一些连接循环换为非循环)。

    13410

    如何存储社交软件中的「好友、粉丝关系」

    我们可以从以下两个区域来探讨: 内存(如Redis) 硬盘(数据库) 03 ""的存储 在内存里可以使用这两种方式: 邻接矩阵 Adjacency Matrix 邻接 Adjacency List...04 邻接矩阵 Adjacency Matrix 这个邻接矩阵其实就是一个二维数组,我们就用上面的结构来举例子,避免兄弟们忘记所以这里我再放一次: 我们两个人的编号作为二维数组(Array[x][...y])的下标,若为好友关系,则该坐标位置的值为1,若不是好友,则置为0, (例:1和2是好友,那么Array[1][2] = 1 ) 于是这个好友圈子的(graph)结构转换成邻接矩阵存储之后就是这样的...06 邻接 Adjacency List 邻接 Adjacency List 邻接基于数组 + 链表,我们依然用"好友"关系的来举例 转换为邻接如下: 邻接的思路是,在左侧数组中保存每个顶点...今天我们通过"如何存储「好友、粉丝关系」"这一命题 分别了解了 graph 这一数据结构 以及两种存储方式: 邻接矩阵 Adjacency Matrix 邻接 Adjacency List

    1.4K20

    数据结构试题库答案算法设计题

    s[++top]:=a; scanf(“%d”,&x); }(3分) while (top) sum+=s[top--]; (3分) printf(“%d”,sum); (1分) } (2)试写出把邻接矩阵表示换为邻接表示的算法...设邻接矩阵为g[n][n](针对无向),定义邻接节点的类型为 struct edgenode { int adjvex; edgenode next; } typedef edgenode...; ++cpot[col]:语句的功能是当每一列进行一次置后,其位置向后加1。...G.vexs[i]; 第二个for循环,初始化邻接矩阵; 第三个for循环,图中边信息存入数组G.vexs[i]中; 本程序的功能是:创建邻接矩阵; scanf("%d,%d",&G.vexnum...K为关键字,用线性探测法再散列法处理冲突,输入关键字序列: (10,24,32,17,31,30,46,47,40,63,49) 造出Hash,试回答下列问题: (1)画出哈希的示意图; (2)若查找关键字

    1.5K80

    的基本操作

    的定义 是一种非线性数据结构, 由【顶点Vertex】 和 【边Edge】组成。我们可以G抽象地表示为一组顶点V 和一组边 E 地集合。...表示方法 邻接矩阵: 设的顶点数量为 n ,「邻接矩阵 Adjacency Matrix」使用一个 n×n 大小的矩阵来表示,每一行(列)代表一个顶点,矩阵元素代表边,用 1 或 0 表示两个顶点之间是否存在边...如果矩阵中的数字换成其他数字, 那么就相当于权重 对于邻接矩阵表示时, 它的curd操作时间复杂度非常低, 都是O(1)。...「邻接 Adjacency List」使用 n 个链表来表示,链表节点表示顶点。第 i条链表对应顶点 i ,其中存储了该顶点的所有邻接顶点(即与该顶点相连的顶点)。...它相较于邻接矩阵最大的优点就是他存储的内容都是有用的, 而不是像邻接矩阵那样都存储。 同时,邻接我们可以进行优化, 链表过长的部分像hash那样转换为红黑树。

    8010

    文心一言 VS 讯飞星火 VS chatgpt (298)-- 算法导论22.1 2题

    ,并返回一个邻接矩阵表示。...然后在main函数中,我们创建了一个示例邻接链表,并将其转换为邻接矩阵。最后,我们打印出邻接矩阵的每一行。 360智脑: 在Go语言中,我们可以创建一个二维数组来表示邻接矩阵。...在邻接链表表示中,每个节点都有一个指向其父节点的指针。为了邻接链表转换为邻接矩阵,我们需要确定每个节点在矩阵中的位置。...以下是使用Go语言构建这个完全二叉树的邻接矩阵的代码: package main import"fmt" func main(){ // 定义完全二叉树的邻接 adjList :=[][]...]int,7) for i :=range adjMatrix { adjMatrix[i]=make([]int,7) } // 根据邻接填充邻接矩阵 for i, neighbors

    7920

    数据结构与算法-的存储结构

    的存储结构分为邻接矩阵邻接两种。 邻接矩阵 1. 邻接矩阵 邻接矩阵表示的各顶点之间关系的矩阵。...带权(网)的邻接矩阵 设G=(V,E)是n个顶点的,则G的邻接矩阵用n阶方阵G表示,若(Vi ,Vj )或 属于 E(G),则G[i][j]为边或弧的权Wij,否则Vi与Vj间无边或弧...建立无向带权邻接矩阵 实现步骤如下: (1). 矩阵A的每个元素都初始化为最大值。 (2)....以下是无向邻接表示例。 ? 以下是有向邻接表示例,每个单链表上记录是该顶点的出度。 ? 对于有向,有时需要建立一个逆邻接,记录每个顶点相关联的入度。 ? 2....邻接表示在检测边数方面比邻接矩阵表示效率要高。 ? 3. 计算的度 (1). 对于无向,第i个链表的结点数为顶点Vi的度; (2).

    1.5K30

    5.2 的存储及基本操作

    无论是有向还是无向,主要的存储方式都有两种:邻接矩阵邻接。前者属于的顺序存储结构,后者属于的链接存储结构。 5.2.1邻接矩阵。...结点树为n的G=(V,E)的邻接矩阵A是n*n的。G的顶点编号为v1,V2,……,Vn。若(vi,vj)属于E,则A[i][j]=1,否则A[i][j]=0。...③无向邻接矩阵是对称矩阵,对规模特大的邻接矩阵可采用压缩存储。 ④邻接矩阵表示法的空间复杂的为O(n^2),其中n为的定点数|V|。...邻接矩阵存储表示法具有以下特点: ①无向邻接矩阵一定是 一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素即可。...这是用邻接矩阵存储的局限性。 ⑤稠密适合使用邻接矩阵的存储表示。 ⑥设G的邻接矩阵为A,A^n的元素A^n[i][j]等于由顶点i到顶点j的长度为n的路径的数目。

    49730

    数据结构【第六章知识小结】

    二、的存储结构 1、邻接矩阵(数组)表示邻接矩阵表示顶点之间相邻关系的矩阵。...无向邻接表示 有向邻接表示 1.出度OD(Vi)=单链出边中链接的结点数 2.入度ID(Vi)=邻接点域为Vi的弧个数 3....② 邻接矩阵的空间复杂度为O(n2),而邻接的空间复杂度为O(n+e)或者O(n+2e) 。 用途:邻接矩阵多用于稠密;而邻接多用于稀疏。...利用邻接矩阵实现DFS 利用邻接进行DFS DFS算法效率分析 (1)用邻接矩阵表示,遍历图中每一个顶点都要从头扫描该顶点所在行,时间复杂度为O(n2)。...(2)用邻接表示,虽然有2e个结点,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为O(n+e)。

    52330

    的存储、BFS、DFS(听说叠词很可爱)

    主要有两种方式来存储,一种是邻接矩阵的方法,另一种是邻接的方式。 2.1. 邻接矩阵 邻接矩阵最直观的一种存储方式,底层依赖于二维数组。...对于带权来说,只是从存储 1 变成存储具体的权重。 ? 邻接矩阵的缺点是在表示一个时通常很浪费存储空间。...另外,假如存储的是稀疏,也就是顶点很多,但是每个顶点的边不多的一种。那么使用邻接矩阵存储更浪费存储空间,因为很多位置的值都是 0,这些 0 其实都是没有用的。...所以,综上来说在邻接中查询两个顶点的关系没有邻接矩阵那么高效了。 但是,为了让查询变得更加高效。...邻接的优点是节省存储空间,但是不方便查找(查找效率肯定没邻接矩阵高)。对于此,我们可以链表替换成查询效率较高的动态数据结构,比如平衡二叉树(红黑树)、跳表、散列表等。 3.

    95920

    数据结构——

    [在这里插入图片描述] 的存储结构 --- 邻接矩阵表示 A = (V, E) 有 n 个顶点,则邻接矩阵是一个二维数组 A.Edgen,定义为: [在这里插入图片描述] 无向邻接矩阵表示...[在这里插入图片描述]邻接不唯一,因各个边结点的链入顺序是任意的 空间效率为O(n+2e),若是稀疏(e<<n^2), 比邻接矩阵表示法O(n^2)省空间 所有链表中边结点数目的一半为图中边数TD(...用途:邻接矩阵多用于稠密;而邻接多用于稀疏 结点中的结点的表示 [在这里插入图片描述] - data:结点的数据域,保存结点的数据值。...--- 邻接矩阵表示的深度优先搜索遍历 [在这里插入图片描述] /*-----------邻接矩阵表示的深度优先搜索遍历-----------*/ void DFS_AM(AMGraph G, int...稠密适于在邻接矩阵上进行深度遍历; 稀疏适于在邻接上进行深度遍历。

    80995
    领券