邻接表的用法

简介: 邻接表的用法

邻接表是图的一种最主要存储结构,用来描述图上的每一个点。对图的每个顶点建立一个容器(n个顶点建立n个容器),第i个容器中的结点包含顶点Vi的所有邻接顶点。

  • 题目:6139. 受限条件下可到达节点的数目


现有一棵由 n 个节点组成的无向树,节点编号从 0 到 n - 1 ,共有 n - 1 条边。
给你一个二维整数数组 edges ,长度为 n - 1 ,
其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。
另给你一个整数数组 restricted 表示 受限 节点。
在不访问受限节点的前提下,返回你可以从节点 0 到达的 最多 节点数目。
注意,节点 0 不 会标记为受限节点。
  • 示例:


输入:n = 7, edges = [[0,1],[1,2],[3,1],[4,0],[0,5],[5,6]],
            restricted = [4,5]
输出:4
解释:上图所示正是这棵树。
在不访问受限节点的前提下,只有节点 [0,1,2,3] 可以从节点 0 到达。
  • 将restricted中的点转化为vis数组的已访问状态,建图然后通过BFS从0开始遍历图,统计入队节点数即为答案。
  • 示例中可以建立的邻接表如下:
[
[1,4,5],
[0,2,3],
[1],
[1],
[0],
[0,6],
[5]
]
  • 实现

class Solution {
    public int reachableNodes(int n, int[][] edges, int[] restricted) {
        // 邻接表的结构
        List<Integer>[] adj = new List[n];
        for (int i = 0; i < n; ++i){
            adj[i] = new ArrayList<>();
        }
        // 邻接表建图
        for (int i = 0; i < n - 1; ++i){
            adj[edges[i][0]].add(edges[i][1]);
            adj[edges[i][1]].add(edges[i][0]);
        }
        boolean[] vis = new boolean[n];
        // 处理restricted数组
        for (int num : restricted) vis[num] = true;
        Deque<Integer> q = new LinkedList<>();
        q.addLast(0);
        vis[0] = true;
        int ans = 1;
        while (!q.isEmpty()){
            // 尾部添加,头部读取,校验是否访问过
            int cur = q.pollFirst();
            for (int next : adj[cur]){
                if (!vis[next]){
                    q.addLast(next);
                    vis[next] = true;
                    ++ans;
                }
            }
        }
        return ans;
    }
}

参考链接:https://leetcode.cn/problems/reachable-nodes-with-restrictions/solution/by-darkbin-elga/

相关文章
|
4月前
|
存储 容器
图的存储结构之打印邻接表
图的存储结构之打印邻接表
36 0
|
4月前
|
存储 监控
【初阶解法-数据结构】包含min函数的栈(代码+图示)
【初阶解法-数据结构】包含min函数的栈(代码+图示)
50 0
|
4月前
|
算法 Python
Python 数据结构和算法:解释深度优先搜索(DFS)和广度优先搜索(BFS)。
Python 数据结构和算法:解释深度优先搜索(DFS)和广度优先搜索(BFS)。
140 0
|
10月前
|
存储 机器学习/深度学习 人工智能
图的存储及基本操作总结(邻接矩阵、邻接表)及C/C++代码实现
图的存储及基本操作总结(邻接矩阵、邻接表)及C/C++代码实现
1194 1
|
11月前
|
算法 定位技术 C语言
【数据结构】迷宫问题DFS非递归(c语言实现)
【数据结构】迷宫问题DFS非递归(c语言实现)
84 0
|
11月前
|
存储 算法
描述图的两种数据结构 - 邻接表和邻接矩阵
描述图的两种数据结构 - 邻接表和邻接矩阵
|
存储 算法
【数据结构】图邻接矩阵的创建完整代码
【数据结构】图邻接矩阵的创建完整代码
290 0
|
Java
数据结构(11)图的遍历,DFS、BFS的JAVA实现
11.1.图的遍历 图的遍历,即将图内所有顶点都访问一遍。 有两种遍历方式: BFS DFS 以下图的遍历为例:
80 0
|
算法 Python
Python|利用BFS求表格中的最短路径
Python|利用BFS求表格中的最短路径
81 0
|
数据采集 算法 C语言
图的遍历——深度优先搜索(DFS)与广度优先搜索(BFS)(附带C语言源码)
图的遍历——深度优先搜索(DFS)与广度优先搜索(BFS)(附带C语言源码)
302 0