树与图的存储与遍历
树图的存储与遍历
树是特殊的图,是无环连通图,所以只需要看图的存储
图分为两种:有向图和无向图
无向图可以看为有向图,把所有无向边都存两个有向边即可
有向图的存储:
- 
邻接矩阵,g[a][b]存储a->b n^2,适合存储稠密图 
- 
邻接表(n个单链表)(推荐) 
使用邻接表存储

树与图的dfs和bfs与搜索算法相似
树的dfs代码实现:
#include <iostream>
using namespace std;
const int N = 100010, M = N * 2; // 因为是双向连通图
int n, m;
int h[N], e[M], ne[M], idx;
bool st[N];
void add(int a, int b)
{
	e[idx] = b;
	ne[idx] = h[a];
	h[a] = idx;
	idx ++ ;
}
void dfs(int u)
{
	st[u] = true;
	
	for (int i = h[u]; i != -1; i = ne[i])
	{
		if (!st[e[i]]) dfs(e[i]);
	}
}
int main()
{
	memset (h, -1, sizeof h);
	return 0;
}
树与图的bfs代码实现:
void bfs()
{
    // bfs之前要memset(h, -1, sizeof h);
	memset(d, -1, sizeof d);
	
	q[0] = 1;
	d[1] = 0;
	int hh = 0, tt = 0; // 用队列来存当前可以往后遍历的点
	while (hh <= tt)
	{
		int t = q[hh ++ ];
		
		for (int i = h[t]; i != -1; i = ne[i])
		{
			int j = e[i];
			if (d[j] == -1)
			{
				d[j] = d[t] + 1;
				q[ ++ tt] = j;
			}
		}
	}
}
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号