📜  将邻接矩阵转换为图的邻接表表示(1)

📅  最后修改于: 2023-12-03 14:53:55.348000             🧑  作者: Mango

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

介绍

邻接矩阵和邻接表是图的两种常见表示方法,其中邻接矩阵使用二维数组表示节点之间的边关系,邻接表使用链表表示节点之间的边关系。在某些场景下,需要将邻接矩阵转换为邻接表来方便地进行一些操作。本文将介绍如何将邻接矩阵转换为邻接表表示。

算法
1. 定义邻接表数据结构
class GraphNode:
    def __init__(self, val=None, neighbors=None):
        self.val = val
        self.neighbors= neighbors if neighbors is not None else []

上述代码定义了一个图节点的类,其中节点的值为val,节点相邻的节点则保存在列表neighbors中。

2. 定义转换函数
def adjacency_matrix_to_adjacency_list(adj_matrix):
    """
    :type adj_matrix: List[List[int]]
    :rtype: List[GraphNode]
    """
    if not adj_matrix:
        return []
    rows, cols = len(adj_matrix), len(adj_matrix[0])
    nodes = [GraphNode(i) for i in range(rows)]
    for i in range(rows):
        for j in range(cols):
            if adj_matrix[i][j] == 1:
                nodes[i].neighbors.append(nodes[j])
    return nodes

上述代码定义了一个将邻接矩阵转换为邻接表的函数,其中输入参数adj_matrix为邻接矩阵,返回值为邻接表所代表的图节点列表。函数中首先根据邻接矩阵的行数创建相应数量的图节点,每个节点的值为该节点的下标i。接着遍历邻接矩阵,将有边相连的节点之间建立“相邻”的关系,即将节点j加入节点i的邻居列表中。

示例

下面给出一个示例,演示如何将邻接矩阵转换为邻接表表示。假设有如下的邻接矩阵:

    0 1 2 3 4
  ---------
0| 0 1 0 0 1
1| 1 0 1 1 1
2| 0 1 0 1 0
3| 0 1 1 0 1
4| 1 1 0 1 0

将该邻接矩阵输入adjacency_matrix_to_adjacency_list函数中,即可得到如下的邻接表表示:

[0] -> [1,4]
[1] -> [0,2,3,4]
[2] -> [1,3]
[3] -> [1,2,4]
[4] -> [0,1,3]

上述结果表示了图中各节点之间的相邻关系,可以方便地进行一些图相关的操作。

总结

本文介绍了如何将邻接矩阵转换为邻接表表示,通过定义图节点的类以及转换函数,可以方便地将邻接矩阵转换为邻接表。这种转换可以方便进行图相关的操作,也使图的表示更加灵活。