图和树的存储方式:邻接矩阵和邻接表

基础算法和数据结构合集:
https://blog.csdn.net/GD_ONE/article/details/104061907

摘要

本文主要介绍邻接矩阵和邻接表的实现方式,无向图和有向图的区别,以及稠密图和稀疏图的区别。以及两种存储方式的使用场景。 稠密图使用邻接矩阵存储,稀疏图使用邻接表存储

无向图和有向图的区别

无向图是特殊的有向图, 无向图就是两个点只要有边,就可以互相到达,所以建无向图的时候就把它当成两点之间有来去两条边的有向图。

稀疏图和稠密图

稀疏图一般指的是一个图中点数和边数是同一数量级的,比如点数是1000变数也是1000左右的,而稠密图一般指边数是点数的平方,比如点数是100,而边数是10000。

邻接矩阵

邻接矩阵虽然听着很厉害,很深奥,但是其实呢,就是一个二维数组。所以当稀疏图的点数很大时,就不能用二维数组来存了。

假设一个有向图为:
在这里插入图片描述
那么邻接矩阵D表示为:
在这里插入图片描述
其中,INF表示正无穷,即该点和另一个点之间没有边相连。
所以D[i][j]就是i号点到j号点之间边的长度

邻接矩阵的初始化

因为自己到自己的距离是0,并且如果两点之间没有边相连要设为INF,所以要先将这两种情况给初始化。

假设有一共有n个点,设邻接矩阵为D
代码:

for(int i = 1; i <= n; i++){
	for(int j = 1; j <= n; i++){
		if(i == j){
			D[i][j] = 0;
		}
		else{
			D[i][j] = INF; 
		}
	}
}

注意: INF一般设为:0x3f3f3f3f

邻接矩阵的读入

重边和自环:
重边就是输入数据中重复给出两个点之间的边。
自环就是一个点与自己相连。
无向图和有向图的区别:
无向图是特殊的有向图,我们对有向图建边的时候只

有些题目可能存在重边和自环,所以读入边的时候要特判一下。比如求最短路问题时会将最小的边存储起来。

一般的读入格式:(假设一共有m条边, 每行给出3个整数,a, b, w, 表示a到b的边长为w)

for(int i = 1; i <= m; i++){
	int a = in.nextInt();
	int b = in.nextInt();
	int w = in.nextInt();
	D[a][b] = Math.min(D[a][b], w); //如果有重边则只存储最短的
}

邻接表

邻接表采用的是数组+链表的存储方式,和之前讲过的哈希表用拉链法实现的方式是一模一样的。

以上面的有向图为例,该图的邻接表图示为::

在这里插入图片描述
所以邻接表就是将一个点的所有出边存储在一条单链表上

邻接表的实现

邻接表的实现方法有很多种,可以使用二维的Vector(动态数组)来存储每个点的出边。另外,也可以使用数组模拟单链表的方法,这里推荐使用数组模拟单链表的方法来实现邻接表,原因还是这种方式效率高。另外,这跟哈希表用拉链法解决冲突是完全一样的。唯一的区别是,再存储边的时候,我们不仅需要存储边的长度还需要存储当前点是和哪个点相连。
另: (静态邻接表又被称为链式前向星)

int [] e = new int[N]; // 表示指向的点
int [] w = new int[N]; // 表示边长
int [] next = new int[N]; // next指针
int [] head = new int[N]; // 邻接表表头
int idx = 1; // 链表结点编号

// 插入
public static void add(int a, int b, int c){ // 将a和b之间建一条边
	e[idx] = b; // 存储a点指向哪个点
	w[idx] = c; // 存储边长
	next[idx] = head[a];
	head[a] = idx++; 
}

// 遍历一个点的所有出边
for(int i = head[a]; i != 0; i = next[i]){
	int b = e[i]; // a点指向的边
	int c = w[i]; // a到b的边长
}

// 无向图的读入, 假如有m条边
for(int i = 0; i < m; i++){
	int a = in.nextInt();
	int b = in.nextInt();
	int c = in.nextInt();
	add(a, b, c);
	add(b, a, c); //因为是无向图所以要反向建边。
}

用数组模拟邻接表主要就是要理解以上三个函数,难度不大,学完了本章,快去学习最短路吧:最短路问题的五种算法

发布了72 篇原创文章 · 获赞 271 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/GD_ONE/article/details/104351714
今日推荐