邻接表和邻接矩阵、树的遍历 (DFS和BFS)

文章目录

  • 前言
  • 一、邻接表与邻接矩阵
    • 1.稀疏图与稠密图
    • 2.邻接矩阵的储存方式
    • 3.邻接表的储存方式
  • 二、树的遍历
    • 1.DFS
    • 2.BFS
  • 总结


前言

如果大家还不太熟悉DFSBFS的,可以去看看我前两篇博客,我在浅谈了一下DFSBFS。这篇博客我将讲一下树与图的遍历(DFS和BFS)。这篇博客还会学到稠密图,稀疏图,邻接矩阵,邻接表与树 存储的关系


一、邻接表与邻接矩阵

1.稠密图与稀疏图

图的储存方式分两种:邻接表邻接矩阵。 了解邻接矩阵邻接表之前我们要先学会稠密图、稀疏图

百度百科来说:稠密图、稀疏图。

稀疏图:有很少条边或弧(边的条数|E|远小于|V|²)的图称为稀疏图(sparse graph)。

稠密图:有很多条边或弧  (边的条数|E|接近|V|²)  的图称为稠密图(dense graph)。

简单来说:我们假设某个图的点的个数 为 N, 边的个数为 M, 当  M << N ^ 2 (平方)(当边数远小于点的平方)时称为 稀疏图,当 M ≈ N ^ 2 (当边数约等于点的平方)时称为 稠密图, 如果图为稀疏图的时候,我们一般用邻接表储存,稠密图的时候,一般用邻接矩阵存储。

2.邻接矩阵的存储方式

邻接矩阵:邻接矩阵的储存方式是用一个二维数组g[a][b](a -> b的权值)来表示图的边的信息,a, b都是点, g[a][b] 表示a到b的距离。

图解:(图片来源于百度百科)

邻接表和邻接矩阵、树的遍历 (DFS和BFS)_第1张图片

 代码:

//运用在最短路或者最小生成树中邻接矩阵的代码方式
while(m --){ //m条边 
	int a, b, w;
	cin >> a >> b >> w;
	g[a][b] = min(g[a][b], w); //取最小的边
}

3.邻接表的存储方式

邻接表:邻接表的储存方式是用单链表来存储,在单链表中,头结点存储的是a, 链表存储的可能是b, c , d。例如:a -> b -> c -> d表示a能到b、a能到c、a能到d

链表结构ne[ ]数组:next指针,e[ ]: a能到的点, w[ ]: a到b的距离。

图解:(图片来源于百度百科) 

邻接表和邻接矩阵、树的遍历 (DFS和BFS)_第2张图片

代码:

//idx 表示当前节点 
void add(int a, int b, int c){
	e[idx] = b; 
	w[idx] = c;
	ne[idx] = h[a];
	h[a] = idx ++;
}

while(m --){ //m表示边数 
	int a, b, c;
	cin >> a >> b >> c;
	add(a, b, c);
} 

二、树的遍历

1.DFS 

如果对dfs还不太懂的话可以了解一下这个:DFS (深度优先算法)_1234_6的博客-CSDN博客

代码如下:

void dfs(int u){
    st[u] = true;//已经遍历到了
    for(int i = h[u]; i != -1; i = ne[i]){ //遍历链表
        int j = e[i];
        if(!st[j]){
            dfs(j); //递归
            //进行相应的操作
        }
    }
}

2.BFS

如果对bfs还不太懂的话可以了解一下这个:BFS(广度优先算法)_1234_6的博客-CSDN博客

int bfs(){
	queueq;
	q.push(1);
	while(q.size()){
		int t = q.front();
		q.pop();
		for(int i = h[t]; i != -1; i = ne[i]){ //遍历链表
			int j = e[i];
			q.push(j); //入队
		}
	}
}


总结

这篇博客我们了解了BFS和DFS的树的遍历,接下来我们要讲的最短路问题(Dijkstra,Bellman, Spfa, Floyd)算法。

你可能感兴趣的:(基础算法,链表,图论,dfs,bfs,算法)