博客
关于我
图的表示形式:邻接矩阵和邻接表
阅读量:535 次
发布时间:2019-03-08

本文共 1525 字,大约阅读时间需要 5 分钟。

图表是对象和对象之间存在的关系的有限集合,可以通过顶点和边来表示。顶点代表对象,边代表它们之间的关系。根据不同需求,图可以分为有向图和无向图两种形式。

在有向图中,每条边由一对有序顶点(i, j)表示,边从顶点i指向顶点j。在无向图中,边由无序顶点对(i, j)表示,即顶点i和顶点j之间存在相互连接的关系。

探索图形的表示方法,邻接矩阵和邻接表是两种常用的方法。邻接矩阵是一个N×N的二进制矩阵,其中A[i][j]为1表示顶点i到顶点j有边存在。对于示例图D.1,邻接矩阵显示了有向图的边信息,而UD.1的邻接矩阵显示了无向图的边信息。

邻接表则采用数组形式存储,每个顶点对应一个列表,存储直接连接的顶点。在有向图中,D.1的邻接表只添加了起点到终点的连接;而在无向图中,UD.1的邻接表会添加相互连接的调节。

构造邻接矩阵需要初始化一个N×N的矩阵,并为每条边设置对应的值。对于无向图,还需要为反向边设置值。以下是实现邻接矩阵和邻接表的C++代码示例:

#include 
using namespace std;int main() { int n, m; cin >> n >> m; vector
> adj_matrix(n, vector
(n, 0)); for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; adj_matrix[u][v] = 1; if (u != v) adj_matrix[v][u] = 1; // 无向图时的处理 } // 输出邻接矩阵 for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cout << adj_matrix[i][j] << " "; } cout << endl; } adj_list[n].clear(); for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; adj_list[u].push_back(v); if (u != v) adj_list[v].push_back(u); // 无向图时的处理 } // 输出邻接表 for (int i = 0; i < n; ++i) { cout << "节点" << i << "的邻接点是:"; for (int j : adj_list[i]) { cout << j << " "; } cout << endl; } return 0;}

在实际应用中,邻接矩阵适合密集图,而邻接表更适合稀疏图。Floyd-Warshall算法需要邻接矩阵,而DFS和BFS通常更适合邻接表。因此,选用哪种表示方法取决于具体需求和数据结构。

图的表示方法不仅影响了数据结构和算法的选择,还决定了空间和时间复杂度。邻接矩阵的复杂度为O(N²),查找边存在的复杂度为O(1);邻接表则为O(N + M),查找复杂度为O(度)。在实际应用中,应根据密度判断选择适合的表示方式,以在性能和空间上达到最佳平衡。

转载地址:http://honiz.baihongyu.com/

你可能感兴趣的文章
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>
MYSQL:基础——3N范式的表结构设计
查看>>
MYSQL:基础——触发器
查看>>
Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
查看>>