邻接矩阵转化为邻接表
时间: 2023-09-14 16:09:19 浏览: 270
将邻接矩阵转化为邻接表可以通过遍历邻接矩阵中每个元素来实现。
具体步骤如下:
1. 创建一个空的邻接表。
2. 遍历邻接矩阵中的每个元素,如果该元素的值为1,则表示有一条边,根据该边的起点和终点,在邻接表中添加相应的边和节点。
3. 对于无向图,需要在邻接表中同时添加起点和终点的边,因为邻接矩阵是对称的。
4. 完成所有元素的遍历后,邻接表就构建完成了。
下面是一个示例代码,将邻接矩阵转化为邻接表:
```python
def adjacency_matrix_to_list(adj_matrix):
adj_list = {}
for i in range(len(adj_matrix)):
adj_list[i] = []
for j in range(len(adj_matrix[i])):
if adj_matrix[i][j] == 1:
adj_list[i].append(j)
adj_list[j].append(i) # 无向图需要同时添加起点和终点的边
return adj_list
```
其中,adj_matrix 是邻接矩阵,adj_list 是转化后的邻接表,返回值即为 adj_list。
相关问题
c++设计算法将无向图邻接矩阵转换为邻接表,将邻接表转换为邻接矩阵
将无向图的邻接矩阵转换为邻接表,可以遍历整个矩阵,对于每个非零元素,将其所在的行和列分别对应到邻接表中的一个顶点,然后在这两个顶点的邻接表中分别添加对方作为相邻节点的边。具体实现代码如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> matrixToAdjList(vector<vector<int>> matrix) {
int n = matrix.size();
vector<vector<int>> adjList(n);
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (matrix[i][j] != 0) {
adjList[i].push_back(j);
adjList[j].push_back(i);
}
}
}
return adjList;
}
```
将邻接表转换为邻接矩阵,可以先遍历邻接表中的所有顶点,对于每个顶点,遍历其邻接表中的节点,将其对应的邻接矩阵位置设为1。具体实现代码如下:
```c++
vector<vector<int>> adjListToMatrix(vector<vector<int>> adjList) {
int n = adjList.size();
vector<vector<int>> matrix(n, vector<int>(n, 0));
for (int i = 0; i < n; i++) {
for (int j : adjList[i]) {
matrix[i][j] = 1;
matrix[j][i] = 1;
}
}
return matrix;
}
```
以上是将无向图的邻接矩阵转换为邻接表,以及将邻接表转换为邻接矩阵的具体实现代码,您可以根据实际情况进行调整。
深度优先遍历邻接矩阵邻接矩阵转化为邻接链表
深度优先遍历是一种图遍历算法,它从某个顶点开始,递归地访问该顶点的所有邻接顶点,直到所有顶点都被访问为止。具体实现可以使用栈来存储访问过的节点,每次取出栈顶元素并将其未访问的邻居节点入栈,直到栈为空。
邻接矩阵是一种表示图的数据结构,它是一个二维数组,数组元素表示两个节点之间是否有边相连。邻接链表是另一种表示图的数据结构,它由若干个链表组成,每个链表表示一个节点以及与它相连的所有边。将邻接矩阵转化为邻接链表可以通过遍历邻接矩阵,将每个节点以及与它相连的边添加到对应的链表中。
具体步骤如下:
1. 创建一个包含n个链表的数组,n为图的节点数。
2. 遍历邻接矩阵的每个元素,如果元素值为1,则将其对应的节点和与之相连的节点添加到对应的链表中。
3. 重复步骤2直到遍历完整个邻接矩阵。
阅读全文