树与图的存储

本文详细介绍了图数据结构中两种常见的存储方式:邻接矩阵与邻接表,并通过示例代码展示了如何用邻接表来实现有向图的存储及基本操作如添加边、深度优先搜索(DFS)和广度优先搜索(BFS)。通过本文,读者可以了解到不同存储方式的特点及其适用场景。
  • 邻接矩阵:空间复杂度: 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);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值