- 邻接矩阵:空间复杂度: O ( N 2 ) O(N^2) O(N2),常用于存储密集图
- 邻接表:对于每个节点建立一个链表,每个点的链表存储的是这个点能连接到下一个点的信息
有向图的邻接表存储就是对于每个点 v 对应一个头节点, 记录在h[v]
idx是图里边的编号,和建图的顺序有关,对于某一个点v, 它的所有邻边的编号不一定是连续的。
e 数组是edge的缩写,记录了某一条有向边的终点
ne数组是next的缩写,记录了邻接表里的同一个点的下一条邻边的idx
ne[idx]=h[a]; h[a]=idx; 就是把新建的边插入队头。(先把新建的边的next指向现在队头的next,然后更新队头的next)
然后再idx++, 给下一次建边使用
然后再配合这个链接食用
void init(){
memset(h, -1, sizeof(h));
}
void add(int a, int b){ // 插入一条a指向b的边
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void dfs(int u){ // 遍历第u号节点
vis[u] = 1;
for(int i = h[u]; i != -1; i = ne[u]){
int j = e[i];
if(!vis[j]) dfs(j);
}
}
// bfs遍历图点的层次
void bfs(){
queue<int> q;
q.push(1);
memset(dis, -1, sizeof(dis));
dis[1] = 0;
while(!q.empty()){
int f = q.front();
q.pop();
for(int i = h[f]; i != -1; i = ne[i]){
int j = e[i];
if(dis[j] == -1){
dis[j] = dis[f] + 1;
if(j == n) return;
q.push(j);
}
}
}
}
本文详细介绍了图数据结构中两种常见的存储方式:邻接矩阵与邻接表,并通过示例代码展示了如何用邻接表来实现有向图的存储及基本操作如添加边、深度优先搜索(DFS)和广度优先搜索(BFS)。通过本文,读者可以了解到不同存储方式的特点及其适用场景。

被折叠的 条评论
为什么被折叠?



